我是一位资深的.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)的基本误解。如果有人能够对此有所了解,我将非常感激。
答案 0 :(得分:7)
回答这个问题可能为时已晚,但我确实在你的代码中注意到了一件事。您在代码location1和location(没有1)中使用了2个不同的变量。
EXEC_BAD_ACCESS 通常表示您尝试将消息发送到不存在的对象。通常这是因为它已被解除分配。但是,在您的情况下,它似乎从一开始就不存在。
正如您所说,您没有分配枚举。但它不是问题的枚举。 objective-c中的“点”语法只是发送访问者消息的捷径。
您的代码相当于:
LocationStatus status = [location status];
将合成的-(LocationStatus)status{}
消息发送到不存在的位置对象(当然除非location1
只是您帖子中的拼写错误,但不在您的代码中,这使我的评论无关紧要)。所以,只需将location.status
更改为location1.status
,您就应该好了(当然,除非在您向其发送消息之前释放location1
)。
答案 1 :(得分:5)
EXC_BAD_ACCESS几乎总是意味着您正在尝试使用对已被解除分配的对象的引用(通常是过度释放的错误)。在SO上搜索该错误,以找到关于跟踪它的 lot 建议。