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

來源:互聯網
上載者:User

標籤:

@代表“Objective-C”的標誌,證明您正在使用Objective-C語言

 

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 一致;只是可讀性更強一些。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.