我一直在用C和Cocoa框架開發相當長時間。但是,我仍然不清楚,我什麼時候應該設置對象引用爲零。我知道建議在釋放具有委託的對象之前這樣做,並且您還應該在viewDidUnload方法中爲保留的子視圖執行此操作。但是到底什麼時候應該這樣做,爲什麼?它究竟完成了什麼?先謝謝你。Objective C iPhone何時將對象引用設置爲無
-Oscar
我一直在用C和Cocoa框架開發相當長時間。但是,我仍然不清楚,我什麼時候應該設置對象引用爲零。我知道建議在釋放具有委託的對象之前這樣做,並且您還應該在viewDidUnload方法中爲保留的子視圖執行此操作。但是到底什麼時候應該這樣做,爲什麼?它究竟完成了什麼?先謝謝你。Objective C iPhone何時將對象引用設置爲無
-Oscar
假設你有一個指針在類的接口定義myView
:
@interface MyClass {
UIView *myView;
}
@end
在你的代碼
然後,在某些時候,你可能會發布該變量:
[myView release];
這樣做後,指針myView
將不會指向零,但會指向一個不再存在的對象的內存地址(s因爲你剛發佈它)。所以,如果你碰巧在這之後做了一些事情,比如:
[myView addSubview:otherView];
你會得到一個錯誤。
如果,另一方面,你這樣做:
[myView release];
myView = nil;
...
[myView addSubview:otherView];
調用addSubview
不會有任何負面影響,因爲消息,零被忽略。
其必然結果是,你可能會看到使用retain
性質的建議,如:
@property(retain) UIView *myView;
,然後在代碼中,只是做:
self.myView = nil;
通過這樣做,所合成的訪問將釋放舊對象並將參考設置爲一行代碼中的零。如果你想確保你的所有屬性都被釋放並設置爲零,這可能證明是有用的。
一件事,你必須永遠不會忘記,是內存管理是由retain
release
調用來完成,而不是通過分配零的手段。如果您有與1擋計數的對象,並指定零到它的唯一變量,你會泄漏內存:
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
view = nil;
// You just leaked a UIView instance!!!
每一個有抱負的可可程序員都應該閱讀。我已經閱讀過Kochan,Hillegass和Apple的文檔,並且我花了將近6個月的時間來理解這裏解釋的一些概念。現在對我來說似乎很明顯,但它肯定不是以前。 vote ++ – refulgentis 2009-11-04 02:49:52
很好的回答!!!非常感謝。 – 2009-11-04 15:03:27