2011-10-07 84 views
4

應該顯式釋放帶有@property nonatomic和retain的變量。IOS:使用@property發佈變量(非原子,保留)

@interface MyScreenViewController : UIViewController <UIWebViewDelegate> { 
    UIWebView* greetingView; 
} 

@property(nonatomic, retain) IBOutlet UIWebView* greetingView; 

- (void)dealloc { 
    [greetingView release]; 
} 

在delloc方法中釋放必需???

+1

您必須**在繼續進行任何編碼之前閱讀此內容:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – trojanfoe

回答

5

Ofcourse。是的,你應該釋放你的財產保留,複製,不要分配。您在viewDidUnload中將該屬性設置爲Nil。

- (void)viewDidUnload { 
    [super viewDidUnload]; 

    self.greetingView = nil; 
} 

- (void)dealloc { 
    [greetingView release],greetingView = nil; 

    [super dealloc]; 
} 

參考存儲器管理在UIViewController類參考:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

內存在IOS關鍵資源,和視圖控制器提供內置支持用於在關鍵時刻減少他們的內存佔用量。 UIViewController類通過其didReceiveMemoryWarning方法提供了一些自動處理低內存條件的方法,該方法釋放不需要的內存。在iOS 3.0之前,這種方法是釋放與您的自定義視圖控制器類相關聯的額外內存的唯一方式,但在iOS 3.0和更高版本中,viewDidUnload方法可能更適合大多數需求。

當發生低內存警告時,如果UIViewController類知道它可以重新加載或稍後再次創建,則清除它的視圖。如果發生這種情況,它還會調用viewDidUnload方法,讓您的代碼有機會放棄與視圖層次關聯的任何對象的所有權,包括使用nib文件加載的對象,在viewDidLoad方法中創建的對象以及在運行時並添加到視圖層次結構中。通常,如果您的視圖控制器包含插口(屬性或包含IBOutlet關鍵字的原始變量),則應該使用viewDidUnload方法放棄這些插口或您不再需要的任何其他視圖相關數據的所有權。

+0

in viewDidUnload' self.greetingView = nil;'被設置,然後調用delloc並執行釋放。但變量值爲零。這是否按預期工作? – nanjunda

+0

如果在類的值爲零時調用某個消息,它將不執行任何操作並返回nil。所以如果greetingView是零,[greetingView發佈]什麼也不做。這是沒有問題的。 –

+0

是的......然後我們還沒有發佈它......因爲它設置爲零,所以在調用dealloc之前。如上所示。 – nanjunda

2

是的,你應該釋放它,因爲它是一個保留的屬性。保留(或複製)的任何屬性應由同一個類發佈(如果已分配,則不需要釋放)。

保留基本上就像一個班,說:「我將要使用這個其他班級,所以留在記憶裏。」 dealloc就是這樣說的那個類,它本身將被從內存中移除。因此,如果需要保留屬性的類即將消失,那麼該對象本身也應該被釋放。

否則,它只是坐在那裏的記憶,當沒有其他的程序需要它。如果這種事情繼續發生,你將耗盡內存。

(此外,還要確保你,你在你的dealloc方法的末尾調用[super dealloc]。)

相關問題