Objective C屬性property詳解

2021-08-16 22:28:20 字數 3946 閱讀 6216

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 ...