繁体   English   中英

使用枚举类型作为Objective C中的属性

[英]Using enum types as properties in Objective C

我是一位资深的.NET开发人员,他第一次涉足Objective C编程。 我对枚举类型的属性有困难。 一些上下文...我有一个类头和枚举像这样:

typedef enum  {
    Open,
    Unavailable,
    Unknown
} LocationStatus;

@interface Location : NSObject {

    LocationStatus status;
}

@property (nonatomic) LocationStatus status;

@end

和一个看起来像这样的实现:

@implementation Location

@synthesize status;

@end

在代码中的某个时刻,我设置的值如下:

location1.status = Open;

然后调试器将其评估为具有正确的值,并且它正在解析为正确的枚举(还要注意,此处未显示其他属性......它们也正确评估)。

稍后在代码中,我尝试读取这样的属性:

LocationStatus status = location.status;

在代码的这一点上,调试器能够正确地评估我的类的所有属性,除了Status ,它显示内存地址,但不是实际值。 当执行到达此行时,我一直在控制台中收到EXC_BAD_ACCESS错误,并且应用程序崩溃。

我很确定这反映了我对如何在Objective C中使用属性和枚举(以及可能是C)的基本误解。 如果有人能对此有所了解,我将非常感激。

回答这个可能为时已晚,但我确实在你的代码中注意到了一件事。 您在代码location1和location(没有1)中使用了2个不同的变量。

EXEC_BAD_ACCESS通常表示您尝试将消息发送到不存在的对象。 通常这是因为它已被解除分配。 但是,在您的情况下,它似乎从未存在过。

如你所知,你没有分配枚举。 但它不是问题的枚举。 objective-c中的“点”语法只是发送访问者消息的捷径。

您的代码相当于:

LocationStatus status = [location status];

这将合成的-(LocationStatus)status{}消息发送到不存在的位置对象(除非当然, location1只是您帖子中的拼写错误,但不在您的代码中,这使得我的评论无关紧要)。 所以只需将location.status更改为location1.status ,你应该好好去(当然,除非在你向它发送消息之前发布了location1 )。

EXC_BAD_ACCESS几乎总是意味着您正在尝试使用对已被解除分配的对象的引用(通常是过度释放的错误)。 在SO上搜索该错误,以找到有关跟踪它的大量建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM