1. 程式人生 > >[objective-C] 08.記憶體管理1

[objective-C] 08.記憶體管理1

  1. 引用計數的增加和減少相等,當引用技術降為0之後,不應該再使用這塊記憶體空間
  2. 凡是使用了alloc、retain或者copy讓記憶體的引用技術增加了,就需要使用release或者autorelease讓記憶體的引用技術減少。在一段程式碼內,增加和減少的次數要相當。
  3. autoreleasepool的使用
    通過autoreleasepool控制autorelease物件的釋放。
    向一個物件傳送autorelease訊息,這個物件何時釋放,取決於autoreleasepool

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Person

     *p = [[Person alloc] init]; // retainCount1

    [p retain]; // retainCount2

    [p autorelease]; // retainCount未來的某個時刻釋放

    [pool release];

    NSLog(@"%lu", (unsigned long)[p retainCount]);

  4. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];和[pool release];就像一個一對括號,[xxx autorelease];必須寫在兩者之間。
  5. [xxx autorelease];出現在兩者之間,pool就會把接收autorelease的物件儲存起來(以棧的方式,把物件亞入棧)
  6. 當[pool release];的時候,pool會向之前儲存的物件逐一發送release訊息(物件出棧,越晚autorelease的物件,越早接收release訊息)
  7. 在iOS5之後,不在推薦使用NSAutoreleasePool類,使用@autoreleasepool{}替代,之前寫在NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];和[pool release]; 之間的程式碼,需要寫在@autoreleasepool{}的大括號裡。出現大括號,自動釋放池才向各個物件傳送release訊息