簡體   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