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

2024-03-22

我是一名资深的 .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 中使用了 2 个不同的变量(没有 1)。

EXC_BAD_ACCESS通常意味着您正在尝试向不存在的对象发送消息。通常这是因为它已被释放。然而,就你而言,它似乎从一开始就不存在。

正如您所指出的,您没有分配枚举。但问题不是枚举。 Objective-C 中的“点”语法只是发送访问器消息的快捷方式。

您的代码相当于:

LocationStatus status = [location status];

发送合成的-(LocationStatus)status{}发送给不存在的位置对象的消息(当然除非location1只是您帖子中的拼写错误,但不是您代码中的拼写错误,这使得我的评论无关紧要)。所以只要改变location.status to location1.status你应该可以走了(当然,除非location1在您向其发送消息之前已被释放)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Objective C 中使用枚举类型作为属性 的相关文章

随机推荐