Objective-C中的@property和@synthesize用法

jingxianli0922發表於2014-12-03

Objective-C語言關鍵詞,@property與@synthesize配對使用。

 

功能:讓編譯器自動編寫一個與資料成員同名的方法宣告來省去讀寫方法的宣告。

 

如:

1、在標頭檔案中:

C程式碼  
  1. @property int count;  

等效於在標頭檔案中宣告2個方法:

C程式碼  
  1. - (int)count;  
  2. -(void)setCount:(int)newCount;  
 

2、實現檔案(.m)中

C程式碼  
  1. @synthesize count;  

等效於在實現檔案(.m)中實現2個方法。

C程式碼  
  1. - (int)count  
  2. {  
  3.     return count;  
  4. }  
  5. -(void)setCount:(int)newCount  
  6. {  
  7.     count = newCount;  
  8. }  
  

以上等效的函式部分由編譯器自動幫開發者填充完成,簡化了編碼輸入工作量。

 

格式:

 

宣告property的語法為:@property (引數1,引數2) 型別 名字;

 

如:

C程式碼  
  1. @property(nonatomic,retain) UIWindow *window;  

 

其中引數主要分為三類:

 

讀寫屬性: (readwrite/readonly)

setter語意:(assign/retain/copy)

原子性: (atomicity/nonatomic)

 

各引數意義如下:

 

readwrite: 產生setter\getter方法

readonly: 只產生簡單的getter,沒有setter。

assign: 預設型別,setter方法直接賦值,而不進行retain操作

retain: setter方法對引數進行release舊值,再retain新值。

copy: setter方法進行Copy操作,與retain一樣

nonatomic: 禁止多執行緒,變數保護,提高效能

 

引數型別

引數中比較複雜的是retain和copy,具體分析如下:

 

getter 分析

 

1、

C程式碼  
  1. @property(nonatomic,retain)test* thetest;  
  2. @property(nonatomic ,copy)test* thetest;  

等效程式碼:

C程式碼  
  1. -(void)thetest  
  2. {  
  3.   return thetest;  
  4. }  
 

2、

C程式碼  
  1. @property(retain)test* thetest;  
  2. @property(copy)test* thetest;  

等效程式碼:

C程式碼  
  1. -(void)thetest  
  2. {  
  3.     [thetest retain];  
  4.     return [thetest autorelease];  
  5. }  
 

setter分析

 

1、

C程式碼  
  1. @property(nonatomic,retain)test* thetest;  
  2. @property(retain)test* thetest;  

等效於:

C程式碼  
  1. -(void)setThetest:(test *)newThetest {  
  2.     if (thetest!= newThetest) {  
  3.         [thetestrelease];  
  4.         thetest= [newThetest retain];  
  5.     }  
  6. }  
  

 2、

C程式碼  
  1. @property(nonatomic,copy)test* thetest;  
  2. @property(copy)test* thetest;  

 等效於:

C程式碼  
  1. -(void)setThetest:(test *)newThetest {  
  2.     if (thetest!= newThetest) {  
  3.         [thetest release];  
  4.         thetest= [newThetest copy];  
  5.     }  
  6. }  
 

nonatomic

如果使用多執行緒,有時會出現兩個執行緒互相等待對方導致鎖死的情況(具體可以搜下執行緒方面的注意事項去了解)。在沒有(nonatomic)的情況下,即預設(atomic),會防止這種執行緒互斥出現,但是會消耗一定的資源。所以如果不是多執行緒的程式,打上(nonatomic)即可

 

retain

程式碼說明

如果只是@property NSString*str; 則通過@synthesize自動生成的setter程式碼為:

C程式碼  
  1. -(void)setStr:(NSString*)value{  
  2.     str=value;  
  3. }  
  

如果是@property(retain)NSString*str; 則自動的setter內容為:

C程式碼  
  1. -(void)setStr:(NSString*)v{  
  2.     if(v!=str){  
  3.         [str release];  
  4.         str=[v retain];  
  5.     }  
  6. }  
 

 

所有者屬性

我們先來看看與所有權有關係的屬性,關鍵字間的對應關係。

屬性值 關鍵字 所有權
 
strong __strong
weak __weak
unsafe_unretained __unsafe_unretained
copy __strong
assign __unsafe_unretained
retain __strong
strong

該屬性值對應 __strong 關鍵字,即該屬性所宣告的變數將成為物件的持有者。

weak

該屬性對應 __weak 關鍵字,與 __weak 定義的變數一致,該屬性所宣告的變數將沒有物件的所有權,並且當物件被破棄之後,物件將被自動賦值nil。

並且,delegate 和 Outlet 應該用 weak 屬性來宣告。同時,如上一回介紹的 iOS 5 之前的版本是沒有 __weak 關鍵字的,所以 weak 屬性是不能使用的。這種情況我們使用 unsafe_unretained。

unsafe_unretained

等效於__unsafe_unretaind關鍵字宣告的變數;像上面說明的,iOS 5之前的系統用該屬性代替 weak 來使用。

copy

與 strong 的區別是宣告變數是拷貝物件的持有者。

assign

一般Scalar Varible用該屬性宣告,比如,int, BOOL。

retain

該屬性與 strong 一致;只是可讀性更強一些。 

相關文章