【问题标题】:Using enum types as properties in Objective C在 Objective C 中使用枚举类型作为属性
【发布时间】:2010-12-10 07:04:23
【问题描述】:

我是一名资深的 .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)中使用属性和枚举的基本误解。如果有人能对此有所了解,我将不胜感激。

【问题讨论】:

    标签: objective-c properties enums


    【解决方案1】:

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

    EXEC_BAD_ACCESS 通常意味着您正在尝试向不存在的对象发送消息。通常这是因为它已被释放。但是,在您的情况下,它似乎从一开始就不存在。

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

    您的代码相当于:

    LocationStatus status = [location status];
    

    这会将合成的 -(LocationStatus)status{} 消息发送到不存在的位置对象(当然,除非 location1 只是您的帖子中的错字,但不是您的代码中的错字,这使我的评论无关紧要)。因此,只需将 location.status 更改为 location1.status 就可以了(当然,除非 location1 在您向其发送消息之前已被释放)。

    【讨论】:

      【解决方案2】:

      EXC_BAD_ACCESS 几乎总是意味着您试图使用对已释放对象的引用(通常是过度释放错误)。在 SO 上搜索该错误以找到很多关于跟踪它的建议。

      【讨论】:

      • 这是我的第一个想法……我已经在某处释放了价值。让我感到困惑的是,对代码的搜索表明,在整个代码库中只有一个地方该属性获得了分配给它的值,并且在那里放置断点证明该分配只发生了一次。此外,因为 LocationStatus 是一个枚举,所以我不必分配它,这意味着我无法指定它是如何发布的(我完全愿意在这里犯错,请注意)。那么它怎么可能提前发布,我该如何预防呢?有没有更好的分配枚举值的方法?
      • 我的第一个想法是过期的东西是你的位置变量在该分配中的内容。但是打开僵尸,你肯定能看到!
      猜你喜欢
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多