[英]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.