簡體   English   中英

如果以后會檢測到觸摸,應否發布添加到視圖的UIImageView?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM