讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 12.6 實例屬性的內存管理 >

12.6 實例屬性的內存管理

在ARC之前,管理實例屬性(參見第10章關於Objective-C實例變量的介紹)的內存是Cocoa編程中最棘手的困難之一。正確的行為應該是在給屬性賦值時保持一個引用類型的對象,在如下兩種情況中將其釋放:

·為相同的屬性賦予了不同的值。

·實例屬性所在的實例被銷毀了。

為了遵循內存管理的黃金法則,負責內存管理的對象(即所有者)顯然需要是該實例屬性所在的對象。要想確保能夠正確地對屬性的內存進行管理,唯一的做法就是在該屬性的setter方法中進行實現。setter需要釋放該屬性當前值所對應的那個對象,然後保持賦給該屬性的對象。具體細節是很煩瑣的(它們要是同一個對像該怎麼辦),在ARC出現之前,程序員很容易出錯。當然,內存管理不只這些;為了防止所有者銷毀所導致的內存洩漏問題,我們需要實現所有者的dealloc方法(對應於Objective-C的deinit)來釋放掉作為屬性值而保持的每個對象。

幸好,ARC對此完全理解,它會幫你正確地管理好實例屬性的內存,就像所有變量的內存一樣。

這一事實也讓我們知道該如何根據需要釋放對象,這麼做非常有價值,因為一個對象可能會使用大量內存。你不希望對設備的內存造成太大的壓力,因此在使用完對像後就需要將其釋放。此外,當應用進入後台並掛起時,如果發現它使用了過多的內存,那麼Watchdog進程就會在後台終止它;因此,當知道應用將要進入後台時,你可能想要釋放該對像(第3章對此作過介紹)。

你不能(也不可以)顯式調用release,因此需要另闢蹊徑,所採用的方式應該與ARC的設計和行為保持一致。解決辦法就是將另外的值(佔用較少內存)賦給該屬性。這會導致該屬性之前的值被釋放。常見的做法是將該屬性的類型聲明為Optional,即從而簡化隱式展開Optional等。這意味著可以將nil賦給它,這麼做純粹是為了釋放當前值。