Objective C語法property詳解

2021-06-23 00:41:16 字數 4130 閱讀 4847

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基本語法

oc的語法這裡就不給大家介紹了,大家慢慢熟悉。在oc的程式設計中大家可能不常見到c語言中函式的使用了,oc採用的是訊息傳送機制,將方法傳送給物件。方法分為 加號方法 靜態方法,又稱為類方法,由類來呼叫 方法由加號開頭。減號方法 動態方法,又成為物件方法,由物件來呼叫 方法由加號開頭。例如常見的all...

Objective C 基本語法(1)

inte ce democlass nsobject 做為介面的存在,nsobject告訴編譯器,democlass這個類是基於nsobject這個 所有類的 超類的,並繼承nsobject類定義的所有行為 democ democ 1 andage 22 呼叫的是 void democ int id...

Objective C語法之Category的使用

無論乙個類設計的如何完美,都不可避免的會遇到沒有 到的需求,那怎麼擴充套件現有的類呢?當然,繼承是個不錯的選擇。但是objective c提供了一種特別的方式來擴充套件類,叫catagory,可以動態的為已經存在的類新增新的行為。這樣可以保證類的原原來的基礎上,較小的改動就可以增加需要的功能。使用c...