ios筆記[email protected]寫法和autorelease pool自
1、@property語法知識介紹
格式:@property(引數1,引數2) 型別 名字;
引數說明:引數可有可無,預設為atomic,表示給方法加鎖,保證執行緒安全。
引數主要分為3類:
1)讀寫屬性:readwrite/readonly :有getter和setter方法/只有getter方法
2)setter處理:assign/retain/copy:直接賦值/需要管理記憶體,計數器加1/拷貝(分深拷貝和淺拷貝)
3)原子性:atomicity/nonatomic :加鎖,只能一個執行緒呼叫/不用考慮執行緒安全,可以多執行緒呼叫
例子:
(1)在宣告檔案中當屬性為物件時,寫法為:
@property (retain)
(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方法。
自動釋放池可以建立多個。
(2)autorelease作用:OC物件只需要傳送一條autorelease訊息,它不會retain計算器也不會release一次計算器,只會把這個物件新增到最近的自動釋放池中(棧頂的釋放池),autorelease實際上只是把對release的呼叫延遲了,對於每一次autorelease
第一種例子如下:(使用動態方法建立一個物件)
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操作。