[英]Should I release an UIImageView added to my view if I will detect touch on it later on?
我了解到,如果您創建了一個對象,那么您將擁有它,並在完成處理后需要釋放它。 在這種情況下,我創建一個UIImageView並將其添加到我的視圖中,如下所示:
myImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];
[myImageView setFrame:CGRectMake(10,10,100,100)];
[self.view addSubview:myImageView];
[myImageView release];
如果以后我想在我的touchEnded方法中像這樣檢測myImageView上的觸摸:
if([touch view] == myImageView){
NSLog(@"TOUCHED!");
}
這行得通,但這是正確的,因為我現在在發布myImageView之后使用了它? 如何從我之前添加的self.view中釋放myImageView?
Cocoa內存管理的基本原則是,您應該保留那些您關心的東西,並釋放那些您不關心的東西。 有一些非常少的異常可以防止保留循環(從不保留委托和數據源),但這是您應該遵循的規則。
在這種情況下,如果您將圖像存儲在ivar中,我將繼續保留它,無論其superview將始終保留它,因此您不必“擁有”。 但是如果從超級視圖中移除視圖,你將會看到一個懸空指針,然后你會崩潰,所以我通過保留來防御性地編碼。 如果你在這里使用了一個訪問器(你應該),那么這將是自動的,更安全。
蘋果公司在iOS中對此變得越來越一致,從而改變了他們對IBOutlets的建議。 在Mac上,您不保留IBOutlets,但在iOS中,Apple 明確指示您這樣做。 這與您正在討論的情況類似,我同意Apple采取更安全方法的舉動。
只要myUIImageView對象的保留計數> 0,它仍然存在,您可以繼續使用它。 當您第一次將其添加為子視圖時,它會獲得一條保留消息,因此它的保留計數很可能為2.然后您將其發送給它,因此其保留計數減少為1.這意味着它仍然存在於內存中。 現在,如果你再次發送它,或者發送它removeFromSuperView
那么它的保留計數將為零,你就會失去它。
行為是不穩定的,有時你可能會看到它有效,有時你會崩潰。
如果要使用該變量指向圖像視圖,請保留ivar(使用retain
屬性)。 這樣,您可以確保圖像視圖可供控制器類使用。
假設myUIImageView是您的自定義UIView子類的ivar,只要您的圖像視圖保留在他的超級視圖中,您的代碼就會起作用。 圖像視圖實例可能已被釋放,並且您可能以引用已釋放對象的無效指針結尾。 你最好崩潰。
根據內存管理指南,您應該將您的圖像視圖< - >自定義uiview子類關系視為更好:
就您而言,這可能是一個很好的參考。 你的myUIImageView ivar應該是你對象的非原子保留屬性。
如果您需要在將來某個時間訪問UIImage
,則需要保留它。
你怎么做,這是你的自由裁量權,但你不應該依靠的UIView重新培訓你的對象為您服務。 你創造的情況現在適用,但它很脆弱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.