[objective-C] 08.記憶體管理1
阿新 • • 發佈:2019-02-04
- 引用計數的增加和減少相等,當引用技術降為0之後,不應該再使用這塊記憶體空間
- 凡是使用了alloc、retain或者copy讓記憶體的引用技術增加了,就需要使用release或者autorelease讓記憶體的引用技術減少。在一段程式碼內,增加和減少的次數要相當。
-
autoreleasepool的使用
通過autoreleasepool控制autorelease物件的釋放。
向一個物件傳送autorelease訊息,這個物件何時釋放,取決於autoreleasepoolNSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Person
[p retain]; // retainCount為2
[p autorelease]; // retainCount為2 未來的某個時刻釋放
[pool release];
NSLog(@"%lu", (unsigned long)[p retainCount]);
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];和[pool release];就像一個一對括號,[xxx autorelease];必須寫在兩者之間。
- [xxx autorelease];出現在兩者之間,pool就會把接收autorelease的物件儲存起來(以棧的方式,把物件亞入棧)
- 當[pool release];的時候,pool會向之前儲存的物件逐一發送release訊息(物件出棧,越晚autorelease的物件,越早接收release訊息)
- 在iOS5之後,不在推薦使用NSAutoreleasePool類,使用@autoreleasepool{}替代,之前寫在NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];和[pool release]; 之間的程式碼,需要寫在@autoreleasepool{}的大括號裡。出現大括號,自動釋放池才向各個物件傳送release訊息