天天看點

黑馬程式員---Objective-C autoreleaseAutoreleaseautorelease的應用Arc的基本使用Arc中的循環引用 

Autorelease

1.autorelease的基本用法

 1> 會将對象放到一個自動釋放池中

 2> 當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作

 3> 會傳回對象本身

 4> 調用完autorelease方法後,對象的計數器不變

2.autorelease的好處

 1> 不用再關心對象釋放的時間

 2> 不用再關心什麼時候調用release

3.autorelease的使用注意

 1> 占用記憶體較大的對象不要随便使用autorelease

 2> 占用記憶體較小的對象使用autorelease,沒有太大影響

4.标準寫法

 1> alloc之後調用了autorelease,又調用release

@autoreleasepool
 {
    Person *p = [[[Person alloc] init] autorelease];
    // 錯誤
    [p release];
 }
           

 2> 連續調用多次autorelease

@autoreleasepool
 {
    Person *p = [[[[Person alloc] init] autorelease] autorelease];
 }
           

5.自動釋放池

 1> 在iOS程式運作過程中,會建立無數個池子。這些池子都是以棧結構存在(先進後出)

 2> 當一個對象調用autorelease方法時,會将這個對象放到棧頂的釋放池

6.自動釋放池的建立方式

 1> iOS 5.0前

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 [pool release]; // [pool drain];
           

 2> iOS 5.0 開始

@autoreleasepool
 {
   
 }
           

标準寫法

void test()
{
    @autoreleasepool
    {   // { 開始代表建立了釋放池
        // autorelease方法會傳回對象本身
        // 調用完autorelease方法後,對象的計數器不變
        // autorelease會将對象放到一個自動釋放池中
        // 當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作
        Person *p = [[[Person alloc] init] autorelease];
        p.age = 10;
        @autoreleasepool
        {
            Person *p2 = [[[Person alloc] init] autorelease];
            p2.age = 10;
        }
        Person *p3 = [[[Person alloc] init] autorelease];
    } // } 結束代表銷毀釋放池
}
           

=============================================================

autorelease的應用

1.系統自帶的方法裡面沒有包含alloc、new、copy,說明傳回的對象都是autorelease的

2.開發中經常會提供一些類方法,快速建立一個已經autorelease過的對象

   1> 建立對象時不要直接用類名,一般用self

+ (id)person
   {
      return [[[self alloc] init] autorelease];
   }
+ (id)person
{
    return [[[self alloc] init] autorelease];
}
+ (id)personWithAge:(int)age
{
    Person *p = [self person];
    p.age = age;
    return p;
}
@autoreleasepool
    {
        Person *p = [Person personWithAge:100];   
        p2.money = 100;
    }
           

=============================================================

Arc的基本使用

1.ARC特點

  1> 不允許調用release、retain、retainCount

  2> 允許重寫dealloc,但是不允許調用[super dealloc]

  3> @property的參數

   * strong :成員變量是強指針(适用于OC對象類型)

   * weak :成員變量是弱指針(适用于OC對象類型)

   * assign : 适用于非OC對象類型

  4> 以前的retain改為用strong

 指針分2種:

 1> 強指針:預設情況下,所有的指針都是強指針 __strong

 2> 弱指針:__weak

在Arc中,定義弱指針是沒有意義的寫法

 __weak Person *p = [[Person alloc] init];

=============================================================

Arc中的循環引用 

當兩端循環引用的時候,解決方案:

1> ARC

 1端用strong,另1端用weak

 @property (nonatomic, strong) Dog *dog;

2> 非ARC 

 1端用retain,另1端用assign