今天早上我遇到了一個iPhone應用程序崩潰,當我修復這個bug時,我很好奇它是一個問題的句法原因。在不使用自引用的情況下設置Objective-C類屬性
這裏是我的代碼簡化爲簡單的元素。我使用NSArray爲項目填充TableView中的項目。該NSArray的是一個屬性:
@interface FooViewController : UITableViewController {
NSArray *stuff;
}
@property (nonatomic, retain) NSArray *stuff;
在我的實現文件:
@synthesize stuff;
- (void)viewDidLoad {
NSArray *arr = [[NSArray alloc] initWithObjects:@"", @"Item 1", @"Item 2",
@"Lorem", @"Ipsum", nil];
self.stuff = arr;
[arr release];
}
現在,當我第一次寫的方法,我不小心不放過的「自我」。並導致了炸彈。雖然在測試時,它一開始就表現出色。我會嘗試:用東西在轟炸其他方法
stuff = arr;
NSLog(@"%d", [stuff count]);
不過。現在我已經解決了這個問題,我可以在其他地方使用[stuff count]。
那麼,爲什麼我可以在一些地方使用東西但在其他地方我必須使用self.stuff?
如果您打算使用屬性,那麼您應該在任何地方使用它們,即dealloc內容應該簡單地讀取: self.stuff = nil; 幫助避免出錯的常用方法是聲明實例變量: NSArray * _stuff; 屬性聲明保持不變,但合成語句現在應該如下所示: @synthesize stuff = _stuff; 現在,每次嘗試使用沒有自己的東西時,編譯器都會標記錯誤。 – 2010-02-08 09:41:37
實際上Apple建議在dealloc中直接釋放類變量,而不是使用屬性 - 這是因爲如果使用屬性,可能會觸發KVC通知,或者可能會通過覆蓋合成的get/set方法啓動其他副作用。 – 2010-02-08 20:18:05
感謝您的提示。我想知道這是如何相關,特別是因爲可能不想* KVO觸發?更不用說在現代運行時中,我們將*擁有使用訪問器和合成實例變量的機會。我想蘋果正在確保他們的代碼能夠抵禦這種情況。到目前爲止,我還沒有遇到任何與我的代碼有關的問題,但是現在我已經警告過了:-) – 2010-02-21 23:50:15