中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
Objective-C中的@property和@synthesize的用法

@代表“Objective-C”的標(biāo)志,證明您正在使用Objective-C語言

 

Objective-C語言關(guān)鍵詞,@property與@synthesize配對使用。

 

功能:讓編譯好器自動編寫一個與數(shù)據(jù)成員同名的方法聲明來省去讀寫方法的聲明。

 

如:

1、在頭文件中:

C代碼  
  1. @property int count;  

等效于在頭文件中聲明2個方法:

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

2、實現(xiàn)文件(.m)中

C代碼  
  1. @synthesize count;  

等效于在實現(xiàn)文件(.m)中實現(xiàn)2個方法。

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

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

 

格式:

 

聲明property的語法為:@property (參數(shù)1,參數(shù)2) 類型 名字;

 

如:

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

 

其中參數(shù)主要分為三類:

 

讀寫屬性: (readwrite/readonly)

setter語意:(assign/retain/copy)

原子性: (atomicity/nonatomic)

 

各參數(shù)意義如下:

 

readwrite: 產(chǎn)生setter\getter方法

readonly: 只產(chǎn)生簡單的getter,沒有setter。

assign: 默認(rèn)類型,setter方法直接賦值,而不進(jìn)行retain操作

retain: setter方法對參數(shù)進(jìn)行release舊值,再retain新值。

copy: setter方法進(jìn)行Copy操作,與retain一樣

nonatomic: 禁止多線程,變量保護(hù),提高性能

 

參數(shù)類型

參數(shù)中比較復(fù)雜的是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

如果使用多線程,有時會出現(xiàn)兩個線程互相等待對方導(dǎo)致鎖死的情況(具體可以搜下線程方面的注意事項去了解)。在沒有(nonatomic)的情況下,即默認(rèn)(atomic),會防止這種線程互斥出現(xiàn),但是會消耗一定的資源。所以如果不是多線程的程序,打上(nonatomic)即可

 

retain

代碼說明

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

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

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

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

 

所有者屬性

我們先來看看與所有權(quán)有關(guān)系的屬性,關(guān)鍵字間的對應(yīng)關(guān)系。

屬性值關(guān)鍵字所有權(quán)
strong__strong
weak__weak
unsafe_unretained__unsafe_unretained
copy__strong
assign__unsafe_unretained
retain__strong
strong

該屬性值對應(yīng) __strong 關(guān)鍵字,即該屬性所聲明的變量將成為對象的持有者。

weak

該屬性對應(yīng) __weak 關(guān)鍵字,與 __weak 定義的變量一致,該屬性所聲明的變量將沒有對象的所有權(quán),并且當(dāng)對象被破棄之后,對象將被自動賦值nil。

并且,delegate 和 Outlet 應(yīng)該用 weak 屬性來聲明。同時,如上一回介紹的 iOS 5 之前的版本是沒有 __weak 關(guān)鍵字的,所以 weak 屬性是不能使用的。這種情況我們使用 unsafe_unretained。

unsafe_unretained

等效于__unsafe_unretaind關(guān)鍵字聲明的變量;像上面說明的,iOS 5之前的系統(tǒng)用該屬性代替 weak 來使用。

copy

與 strong 的區(qū)別是聲明變量是拷貝對象的持有者。

assign

一般Scalar Varible用該屬性聲明,比如,int, BOOL。

retain

該屬性與 strong 一致;只是可讀性更強(qiáng)一些。

 

參考:

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詳細(xì)說明。
@property中的聲明列表已分類為以下幾種:

1, 聲明屬性的訪問方法:

  • getter=getterName
  • setter=setterName
    聲明訪問屬性的設(shè)置與獲取方法名。

2,聲明屬性寫操作權(quán)限:

  • readwrite
    聲明此屬性為讀寫屬性,即可以訪問設(shè)置方法(setter),也可以訪問獲取方法(getter),與readonly互斥。
  • readonly
    聲明此屬性為只讀屬性,只能訪問此屬性對應(yīng)的獲取方法(getter),與readwrite互斥。

3,聲明寫方法的實現(xiàn):

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

4,訪問方法的原子性:

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

 

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

 

 

@synthesize tabBarController=_tabBarController;

@synthesize 中可以定義 與變量名不相同的getter和setter的命名,籍此來保護(hù)變量不會被不恰當(dāng)?shù)脑L問

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
IOS
objective
XCODE 4.2 中的@synthesize, @property
@synthesize
《招聘一個靠譜的iOS》面試題參考答案(上)
Objective-C入門教程03:屬性(@property和@synthesize)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服