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

來源:互聯網
上載者:User

標籤:blog   http   os   使用   io   strong   檔案   ar   資料   

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

 

參考:

http://blog.eddie.com.tw/2010/12/08/property-and-synthesize/

http://www.cocoachina.com/bbs/read.php?tid=7322

http://www.cnblogs.com/pinping/archive/2011/08/03/2126150.html

 

 

聲明的分類

在 Objective-C官方文檔 中的Property一章裡有對類Property詳細說明。
@property中的聲明列表已分類為以下幾種:

1, 聲明屬性的存取方法:

  • getter=getterName
  • setter=setterName
    聲明訪問屬性的設定與擷取方法名。

2,聲明屬性寫操作許可權:

  • readwrite
    聲明此屬性為讀寫屬性,即可以訪問設定方法(setter),也可以訪問擷取方法(getter),與readonly互斥。
  • readonly
    聲明此屬性為唯讀屬性,只能訪問此屬性對應的擷取方法(getter),與readwrite互斥。

3,聲明寫方法的實現:

  • assign
    聲明在setter方法中,採用直接賦值來實現設值操作。如:
C代碼  
  1. -(void)setName:(NSString*)_name{  
  2.      name = _name;  
  3. }  
 
  • retain
    聲明在setter方法中,需要對設過來的值進行retain 加1操作。如:
C代碼  
  1. -(void)setName:(NSString*)_name{  
  2.      //首先判斷是否與舊對象一致,如果不一致進行賦值。  
  3.      //因為如果是一個對象的話,進行if內的代碼會造成一個極端的情況:當此name的retain為1時,使此次的set操作讓執行個體name提前釋放,而達不到賦值目的。  
  4.      if ( name != _name){  
  5.           [name release];  
  6.           name = [_name retain];  
  7.      }  
  8. }  
 
  • copy
    調用此執行個體的copy方法,設定複製後的對象。實現參考retain。

4,存取方法的原子性:

  • nonatomic
    在預設的情況下,通過synthesized 實現的 setter與getter 都是原子性訪問的。多線程同時訪問時,保障存取方法同時只被訪問一個線程訪問,如:
  • C代碼  
    1. [ _internal lock ]; // lock using an object-level lock  
    2. id result = [ [ value retain ] autorelease ];  
    3. [ _internal unlock ];  
    4. return result;  
     
  • 但如果設定nonatomic時,屬性的訪問為非原子性訪問。

 

來源:http://wiki.magiche.net/pages/viewpage.action?pageId=1540101

 

 

 

@synthesize tabBarController=_tabBarController;

@synthesize 中可以定義 與變數名不相同的getter和setter的命名,籍此來保護變數不會被不恰當的訪問

 

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.