1. 程式人生 > >ios筆記[email protected]寫法和autorelease pool自

ios筆記[email protected]寫法和autorelease pool自

1、@property語法知識介紹

格式:@property(引數1,引數2) 型別 名字;

引數說明:引數可有可無,預設為atomic,表示給方法加鎖,保證執行緒安全。

引數主要分為3類:

1)讀寫屬性:readwrite/readonly :gettersetter方法/只有getter方法

2)setter處理:assign/retain/copy:直接賦值/需要管理記憶體,計數器加1/拷貝(分深拷貝和淺拷貝)

3)原子性:atomicity/nonatomic :加鎖,只能一個執行緒呼叫/不用考慮執行緒安全,可以多執行緒呼叫

例子:

1)在宣告檔案中當屬性為物件時,寫法為:

@property  (retain) 

 Book *book;

2)當屬性為基本型別時,寫法為:

@property  (assign)  int age; 預設的也是assign,所以也可以省略不寫

特別說明:

宣告檔案中:

@property (retain) Book *book;

等價於實現檔案中的以下程式碼:

-(void) setBook : (Book  *) book{

if(_book ! = book){

[_book  release];

_book  =  [book  retain];

}

}

-(Book  *) book;

(3)@property (nonatomic, getter = isRich) BOOL rich;

表示呼叫的getter方法名叫isRich;

2、autorelease  pool 自動釋放池介紹

1)概念:自動釋放池是OC裡面的一中記憶體自動回收機制,一般可以將一些臨時變數新增到自動釋放池中,統一回收釋放。

當自動釋放池銷燬時,池裡面的所有物件都會呼叫一次release方法。

自動釋放池可以建立多個。

2autorelease作用:OC物件只需要傳送一條autorelease訊息,它不會retain計算器也不會release一次計算器,只會把這個物件新增到最近的自動釋放池中(棧頂的釋放池),autorelease實際上只是把對release的呼叫延遲了,對於每一次autorelease

,系統只是把該物件放入了當前的autorelease pool中,當該pool被釋放時,該pool中的所有物件都呼叫release操作一次。

第一種例子如下:(使用動態方法建立一個物件)

main.m檔案:

#import<Foundation/Foundation.h>

#import”Student.h”

int main(int argc,const char * argv[])

{

@autoreleasepool{

Student *stu =[[Student alloc]init];//建立一個stu物件

[stu autorelease];//stu這個物件放入釋放池中去,當池子銷燬的時候,所有物件都會release一次

以上兩句程式碼可以寫成Student *stu =[[[Student alloc]init] autorelease];

}

return 0;

}

第二種例子如下:(使用靜態方法建立一個變數,在靜態方法銷燬該變數

Student.m檔案中

#import<Foundation/Foundation.h>

@implementation Student

+(id) student{

Student *stu = [[[Student alloc] init] autorelease];//在靜態方法裡建立一個物件,autorelease把該物件放入到呼叫該方法最近的一個釋放池中去。

return stu;

}

@end

main.m檔案中呼叫該靜態方法建立一個物件

#import<Foundation/Foundation.h>

#import”Student.h”

int main(int argc,const char * argv[])

{

@autoreleasepool{

Student *stu =[Student  student];//呼叫靜態方法建立一個stu物件

}

return 0;

}

例子總結:自動釋放池的好處就是開發者不用再考慮在哪裡放置[stu  release];語句銷燬物件了,一切交給自動釋放池管理。

注意點:

1.在ARC下,不能使用[[NSAutoreleasePool alloc] init],而應使用@autoreleasepool

2.不要把大量迴圈操作放到同一個NSAutoreleasePool之間,這樣會造成記憶體峰值的上升。

3.儘量避免對大記憶體使用該方法,因為這種機制是延遲釋放。

4.sdk中一般利用靜態方法建立並返回的物件都是已經autorelease的,不需要再進行release操作。