標籤:blog http os 使用 io strong 檔案 ar 資料
@代表“Objective-C”的標誌,證明您正在使用Objective-C語言
Objective-C語言關鍵詞,@property與@synthesize配對使用。
功能:讓編譯好器自動編寫一個與資料成員同名的方法聲明來省去讀寫方法的聲明。
如:
1、在標頭檔中:
C代碼
- @property int count;
等效於在標頭檔中聲明2個方法:
C代碼
- - (int)count;
- -(void)setCount:(int)newCount;
2、實現檔案(.m)中
C代碼
- @synthesize count;
等效於在實現檔案(.m)中實現2個方法。
C代碼
- - (int)count
- {
- return count;
- }
- -(void)setCount:(int)newCount
- {
- count = newCount;
- }
以上等效的函數部分由編譯器自動幫開發人員填充完成,簡化了編碼輸入工作量。
格式:
聲明property的文法為:@property (參數1,參數2) 類型 名字;
如:
C代碼
- @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代碼
- @property(nonatomic,retain)test* thetest;
- @property(nonatomic ,copy)test* thetest;
等效代碼:
C代碼
- -(void)thetest
- {
- return thetest;
- }
2、
C代碼
- @property(retain)test* thetest;
- @property(copy)test* thetest;
等效代碼:
C代碼
- -(void)thetest
- {
- [thetest retain];
- return [thetest autorelease];
- }
setter分析
1、
C代碼
- @property(nonatomic,retain)test* thetest;
- @property(retain)test* thetest;
等效於:
C代碼
- -(void)setThetest:(test *)newThetest {
- if (thetest!= newThetest) {
- [thetestrelease];
- thetest= [newThetest retain];
- }
- }
2、
C代碼
- @property(nonatomic,copy)test* thetest;
- @property(copy)test* thetest;
等效於:
C代碼
- -(void)setThetest:(test *)newThetest {
- if (thetest!= newThetest) {
- [thetest release];
- thetest= [newThetest copy];
- }
- }
nonatomic
如果使用多線程,有時會出現兩個線程互相等待對方導致鎖死的情況(具體可以搜下線程方面的注意事項去瞭解)。在沒有(nonatomic)的情況下,即預設(atomic),會防止這種線程互斥出現,但是會消耗一定的資源。所以如果不是多線程的程式,打上(nonatomic)即可
retain
代碼說明
如果只是@property NSString*str; 則通過@synthesize自動產生的setter代碼為:
C代碼
- -(void)setStr:(NSString*)value{
- str=value;
- }
如果是@property(retain)NSString*str; 則自動的setter內容為:
C代碼
- -(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
該屬性值對應 __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代碼
- -(void)setName:(NSString*)_name{
- name = _name;
- }
- retain
聲明在setter方法中,需要對設過來的值進行retain 加1操作。如:
C代碼
- -(void)setName:(NSString*)_name{
- //首先判斷是否與舊對象一致,如果不一致進行賦值。
- //因為如果是一個對象的話,進行if內的代碼會造成一個極端的情況:當此name的retain為1時,使此次的set操作讓執行個體name提前釋放,而達不到賦值目的。
- if ( name != _name){
- [name release];
- name = [_name retain];
- }
- }
- copy
調用此執行個體的copy方法,設定複製後的對象。實現參考retain。
4,存取方法的原子性:
來源:http://wiki.magiche.net/pages/viewpage.action?pageId=1540101
@synthesize tabBarController=_tabBarController;
@synthesize 中可以定義 與變數名不相同的getter和setter的命名,籍此來保護變數不會被不恰當的訪問
Objective-C中的@property和@synthesize用法