@表明「Objective-C」的標誌,證實您正在使用Objective-C語言 php
Objective-C語言關鍵詞,@property與@synthesize配對使用。 html
功能:讓編譯好器自動編寫一個與數據成員同名的方法聲明來省去讀寫方法的聲明。 多線程
如: app
一、在頭文件中: 函數
@property int count;
等效於在頭文件中聲明2個方法: 性能
- (int)count; -(void)setCount:(int)newCount;
二、實現文件(.m)中 ui
@synthesize count;
等效於在實現文件(.m)中實現2個方法。 編碼
- (int)count { return count; } -(void)setCount:(int)newCount { count = newCount; }
以上等效的函數部分由編譯器自動幫開發者填充完成,簡化了編碼輸入工做量。 atom
格式: spa
聲明property的語法爲:@property (參數1,參數2) 類型 名字;
如:
@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 分析
一、
@property(nonatomic,retain)test* thetest; @property(nonatomic ,copy)test* thetest;
等效代碼:
-(void)thetest { return thetest; }
二、
@property(retain)test* thetest; @property(copy)test* thetest;
等效代碼:
-(void)thetest { [thetest retain]; return [thetest autorelease]; }
setter分析
一、
@property(nonatomic,retain)test* thetest; @property(retain)test* thetest;
等效於:
-(void)setThetest:(test *)newThetest { if (thetest!= newThetest) { [thetestrelease]; thetest= [newThetest retain]; } }
二、
@property(nonatomic,copy)test* thetest; @property(copy)test* thetest;
等效於:
-(void)setThetest:(test *)newThetest { if (thetest!= newThetest) { [thetest release]; thetest= [newThetest copy]; } }
nonatomic
若是使用多線程,有時會出現兩個線程互相等待對方致使鎖死的狀況(具體能夠搜下線程方面的注意事項去了解)。在沒有(nonatomic)的狀況下,即默認(atomic),會防止這種線程互斥出現,可是會消耗必定的資源。因此若是不是多線程的程序,打上(nonatomic)便可
retain
代碼說明
若是隻是@property NSString*str; 則經過@synthesize自動生成的setter代碼爲:
-(void)setStr:(NSString*)value{ str=value; }
若是是@property(retain)NSString*str; 則自動的setter內容爲:
-(void)setStr:(NSString*)v{ if(v!=str){ [str release]; str=[v retain]; } }
全部者屬性
咱們先來看看與全部權有關係的屬性,關鍵字間的對應關係。
strong | __strong | 有 |
weak | __weak | 無 |
unsafe_unretained | __unsafe_unretained | 無 |
copy | __strong | 有 |
assign | __unsafe_unretained | 無 |
retain | __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, 聲明屬性的訪問方法:
2,聲明屬性寫操做權限:
3,聲明寫方法的實現:
-(void)setName:(NSString*)_name{ name = _name; }
-(void)setName:(NSString*)_name{ //首先判斷是否與舊對象一致,若是不一致進行賦值。 //由於若是是一個對象的話,進行if內的代碼會形成一個極端的狀況:當此name的retain爲1時,使這次的set操做讓實例name提早釋放,而達不到賦值目的。 if ( name != _name){ [name release]; name = [_name retain]; } }
4,訪問方法的原子性:
[ _internal lock ]; // lock using an object-level lock id result = [ [ value retain ] autorelease ]; [ _internal unlock ]; return result;
但若是設置nonatomic時,屬性的訪問爲非原子性訪問。
來源:http://wiki.magiche.net/pages/viewpage.action?pageId=1540101
@synthesize tabBarController=_tabBarController;
@synthesize 中能夠定義 與變量名不相同的getter和setter的命名,籍此來保護變量不會被不恰當的訪問