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