1.1 property的語法格式:
@property (引數1,引數2)
型別名字;
這裡的引數,主要有以下三種:
setter/getter方法(assign/retain/copy)
讀寫屬性(readwrite/readonly)
atomicity(nonatomic)
1.2 三種方式的使用
assign/retain/copy 代表賦值的方式。
readonly關鍵字代表setter不會被生成,
所以它不可以和 copy/retain/assign組合使用。
atomicity的預設值是atomic,讀取函式為原子操作。
1.2.1 copy/reain/assign 在其中選擇乙個來確定屬性的setter如何處理這個屬性。nsobject物件採用這個中方式。
1.2.2 一些特別的object比如nssstring
使用copy。
1.2.3 assign關鍵字代表setter直接賦值,而不是複製或者保留它。適用於基本資料型別,比如nsinteger和cgfloat,或者你並不直接擁有的型別,比如delegates。
1.1 沒有property和有property的對比
在標頭檔案定義 obj。在.m檔案中使用
[cpp]view plain
copy
#import
@inte***ce viewcontroller : uiviewcontroller
@end
[cpp]view plain
copy
- (void
)viewdidload
提示不可用。
加上property
[cpp]view plain
copy
#import
@inte***ce viewcontroller : uiviewcontroller
@property (nonatomic,retain) nsobject *obj;
@end
編譯能通過,執行,崩潰,提示錯誤
reason: '-[viewcontroller setobj:]: unrecognized selector sent to instance 0x6b6c480
那就是我們沒事實現setter方法。
用@synthesize關鍵字實現getter 和setter。
在.m檔案中
[cpp]view plain
copy
@implementation viewcontroller
@synthesize obj;
- (void
)viewdidload
執行,程式執行正常。說明setter 起作用了。
到底@property和@synthesize關鍵字生成了什麼**呢?我們自己實現getter 和setter也可以替代這些關鍵字。
把這兩個關鍵字對應的**注釋掉
.h[cpp]view plain
copy
#import
@inte***ce viewcontroller : uiviewcontroller
//@property (nonatomic,retain) nsobject *obj;
-(nsobject*)obj;
-(void
)setobj:(nsobject*)newobj;
@end
.m[cpp]view plain
copy
@implementation viewcontroller
//@synthesize obj;
- (void
)viewdidload
-(nsobject*)obj
-(void
)setobj:(nsobject*)newobj
} 再執行,也能正常啟動。說明自己寫的getter 和setter替代了property。@property(nonatomic,retain)
nsobject
*obj;
@property(nonatomic,retain,readwrite) nsobject *obj;
readwrite是預設行為,所以這兩行**等價
@property(retain)
nsobject
*obj;
@property(atomic,retain) nsobject *obj;
atomic是預設行為,所以這兩行**是等價的。
@property(atomic,assign)intnumber;
@property(atomic) int number;
@propertyintnumber;
對int 來說,atomic assign都是預設行為,所以這三行是等價的。
@property
nsobject
*obj;這樣寫行嗎?不行的,報警告
只有int 等基礎資料型別能這麼寫。物件必須加上賦值的型別。
@property(retain)
nsobject
*obj;這樣就沒問題了。何時使用assign、何時使用retain、copy後面再講。
使用copy。
.h檔案
[cpp]view plain
copy
#import
@inte***ce viewcontroller : uiviewcontroller
@property (nonatomic, copy) nsstring *string;
@end
.m檔案
[cpp]view plain
copy
@synthesize string;
- (void
)viewdidload
列印結果
2012-07-19 20:41:44.853 testproject1[1213:f803] str_point:0x6a8e0b0 abcd retaincount:1
2012-07-19 20:41:44.854 testproject1[1213:f803] string_point:0x6a8e0b0 abcd retaincount:2
記憶體位址是一樣的,不是想其他文字所寫的那樣,拷貝了乙份記憶體,這裡用copy也是淺拷貝。retain也+1
使用retain
[cpp]view plain
copy
#import
@inte***ce viewcontroller : uiviewcontroller
@property (nonatomic, retain) nsstring *string;
@end
列印結果是:
2012-07-19 20:42:08.113 testproject1[1230:f803] str_point:0x6d3b8f0 abcd retaincount:1
2012-07-19 20:42:08.114 testproject1[1230:f803] string_point:0x6d3b8f0 abcd retaincount:2,
結果和上面copy一樣。
注意:在ios5之後,加入了automatic reference counting (arc),ios5中新加了關鍵字有strong, weak, unsafe_unretained。
Objective C 屬性詳解
屬性作用 自動生成setter和getter方法 屬性定義 property 屬性的型別 型別與內部操作的例項變數的型別相同 屬性名 和內部操作例項變數名相同 屬性在.h檔案中,自動生成的是setter和getter方法的宣告 屬性特性,1.讀寫特性 1 可讀可寫 讀,getter方法 寫,sett...
Objective C 原子屬性
objective c 在宣告乙個屬性的時候,想必大家都是不用經過大腦思考就會寫 property nonatomic,我們都知道屬性可以是 nonatomic 也可以使 atomic 的,但是好像幾乎所有屬性在宣告的時候 nonatomic,atomic 的屬性幾乎沒出現過。atomic 修飾符彷...
Objective C 方法 屬性
1 2 3 4 5 6 7 8 9 10 11 12 import inte cefraction nsobject propertyintnumerator,denominator 宣告引數的屬性 合成器 void print 宣告列印引數方法 void setto int n over int ...