2009-11-03 61 views
8

我一直在用C和Cocoa框架開發相當長時間。但是,我仍然不清楚,我什麼時候應該設置對象引用爲零。我知道建議在釋放具有委託的對象之前這樣做,並且您還應該在viewDidUnload方法中爲保留的子視圖執行此操作。但是到底什麼時候應該這樣做,爲什麼?它究竟完成了什麼?先謝謝你。Objective C iPhone何時將對象引用設置爲無

-Oscar

回答

40

假設你有一個指針在類的接口定義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; 

通過這樣做,所合成的訪問將釋放舊對象並將參考設置爲一行代碼中的零。如果你想確保你的所有屬性都被釋放並設置爲零,這可能證明是有用的。

一件事,你必須永遠不會忘記,是內存管理是由retainrelease調用來完成,而不是通過分配零的手段。如果您有與1擋計數的對象,並指定零到它的唯一變量,你會泄漏內存:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)]; 
view = nil; 
// You just leaked a UIView instance!!! 
+0

每一個有抱負的可可程序員都應該閱讀。我已經閱讀過Kochan,Hillegass和Apple的文檔,並且我花了將近6個月的時間來理解這裏解釋的一些概念。現在對我來說似乎很明顯,但它肯定不是以前。 vote ++ – refulgentis 2009-11-04 02:49:52

+0

很好的回答!!!非常感謝。 – 2009-11-04 15:03:27

相關問題