Objective-C記憶體管理教程和原理剖析(四)

發表於2014-05-03

系統自動建立新的autorelease pool

在生成新的Run Loop的時候,系統會自動建立新的autorelease pool(非常感謝網友hhyyttneogui的提醒)。注意,此處不同於xcode在新建專案時自動生成的程式碼中加入的autorelease poolxcode生成的程式碼可以被刪除,但系統自動建立的新的autorelease pool是無法刪除的(對於無Garbage Collection的環境來說)。Objective-C沒有給出實現程式碼,官方文件也沒有說明,但我們可以通過小程式來證明。

在這個小程式中,我們先生成了一個autorelease pool,然後生成一個autoreleaseClassA的例項,再在一個新的run loop中生成一個autoreleaseClassB的物件(注意,我們並沒有手動在新run loop中生成autorelease pool)。精簡的示例程式碼如下,詳細程式碼請見附件中的memman-run-loop-with-pool.m

輸出如下:

注意在我們銷燬autorelease pool之前,ClassBautorelease例項就已經被銷燬了。

有人可能會說,這並不能說明新的run loop自動生成了一個新的autorelease pool,說不定還只是用了老的autorelease pool,只不過後來drain了一次而已。我們可以在main函式中不生成autorelease pool。精簡的示例程式碼如下,詳細程式碼請見附件中的memman-run-loop-without-pool.m

輸出如下:

我們可以看出來,我們並沒有建立任何autorelease pool,可是ClassB的例項依然被自動銷燬了,這說明新的run loop自動建立了一個autorelease pool,這個pool在新的run loop結束的時候會銷燬自己(並自動release所包含的物件)。

補充說明

在研究retain count的時候,我不建議用NSString。因為在下面的語句中,

NSString *str1 = @”constant string”;

str1retain count是個很大的數字。Objective-C對常量字串做了特殊處理。

當然,如果你這樣建立NSString,得到的retain count依然為1

NSString *str2 = [NSString stringWithFormat:@”123”];

示例程式碼檔案連結:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip

相關文章