本文為大地瓜原創(chuàng),歡迎知識(shí)共享,轉(zhuǎn)載請(qǐng)注明出處搏明。
雖然你不注明出處我也沒(méi)什么精力和你計(jì)較。
作者微信號(hào):christgreenlaw
如果只有方法的實(shí)現(xiàn)而沒(méi)有聲明闪檬,那么類外部無(wú)法直接調(diào)用此方法星著。該方法就成為了表面上的私有方法。但是粗悯,OC中沒(méi)有真正的私有方法虚循,因?yàn)镺C采用的是消息機(jī)制。
{}形式的實(shí)例變量(成員變量)可以在@interface
中定義样傍,也可以在@implementation
中定義横缔。而在@implementation
中定義的變量和用@private
修飾的變量又不太一樣,在@implementation
中定義的變量只能在本類中訪問(wèn)衫哥,其它類無(wú)法查看茎刚。
@property
是一個(gè)編譯器指令。
@synthesize
是一個(gè)編譯器指令, 它可以簡(jiǎn)化我們getter/setter方法的實(shí)現(xiàn)炕檩。
在@synthesize后面告訴編譯器斗蒋,將要使用的property叫什么,對(duì)應(yīng)的實(shí)例變量叫什么笛质。例子如下:
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
//@synthesize age = _age;
- (void)setAge:(int)age
{
_number = age;
}
- (int)age
{
return _number;
}
//@synthesize age = _number;
如果在@synthesize后面沒(méi)有告訴系統(tǒng)將傳入的值賦值給誰(shuí), 系統(tǒng)默認(rèn)會(huì)賦值給和@synthesize后面寫得名稱相同的成員變量(Xcode4.4之前這個(gè)才有意義泉沾,目前的@property實(shí)現(xiàn)默認(rèn)就是這樣)
@synthesize age;
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
在目前的實(shí)現(xiàn)中,當(dāng)@property聲明了一個(gè)變量妇押,默認(rèn)就會(huì)使用對(duì)應(yīng)的下劃線開頭的實(shí)例變量(這個(gè)實(shí)例變量就不必用花括號(hào)的形式寫出了)跷究。但需要注意的是:它只會(huì)生成最簡(jiǎn)單的getter/setter,不會(huì)對(duì)其進(jìn)行其他操作敲霍。若需要對(duì)數(shù)據(jù)進(jìn)行處理俊马,則需要我們自己重寫getter/setter。
注意<玷尽2裎摇!扩然!如果你同時(shí)重寫了getter和setter艘儒,那么@property將不會(huì)為你生成下劃線開頭的實(shí)例變量!!界睁!你需要手動(dòng)在花括號(hào)中聲明實(shí)例變量>踉觥!翻斟!
property修飾符
@property(readwrite) int age;
@property(getter=myName) NSString* name;
@property(setter=giveName:) NSString* name;
@property(getter=myName,setter=giveName:) NSString* name;
@property(readonly) NSString* id;
@property(getter=isMarried) NSString* married;
//能用修飾符處理的getter/setter就盡量不要額外去寫了逾礁,統(tǒng)一用修飾符處理
id
id是一個(gè)動(dòng)態(tài)數(shù)據(jù)類型,可以用來(lái):
- 定義變量
- 作為函數(shù)參數(shù)類型
- 作為函數(shù)返回值類型
一般情況下访惜,所有的數(shù)據(jù)類型都是靜態(tài)數(shù)據(jù)類型嘹履,也就是說(shuō):
- 編譯時(shí)就知道是什么類型
- 知道類型有哪些方法和屬性
- 編譯時(shí)就可以確定的訪問(wèn)類型的方法和屬性
- 若通過(guò)靜態(tài)類型定義變量,那么訪問(wèn)不屬于靜態(tài)類型的方法或?qū)傩约采幾g器會(huì)報(bào)錯(cuò)植捎,無(wú)法通過(guò)編譯
作為動(dòng)態(tài)類型:
- 編譯時(shí)不知道真是的類型,運(yùn)行時(shí)才知道它的真實(shí)類型
- 通過(guò)動(dòng)態(tài)數(shù)據(jù)類型定義變量阳柔,如果訪問(wèn)不屬于動(dòng)態(tài)數(shù)據(jù)類型的方法或?qū)傩匝媸啵幾g時(shí)不會(huì)報(bào)錯(cuò)
一句話總結(jié):動(dòng)態(tài)數(shù)據(jù)類型,編譯器不知道你的真實(shí)類型舌剂,靜態(tài)類型反之
- 通過(guò)靜態(tài)數(shù)據(jù)類型定義變量, 不能調(diào)用子類特有的方法
- 通過(guò)動(dòng)態(tài)數(shù)據(jù)類型定義變量, 可以調(diào)用子類特有的方法
- 通過(guò)動(dòng)態(tài)數(shù)據(jù)類型定義的變量, 可以調(diào)用私有方法
為了避免動(dòng)態(tài)數(shù)據(jù)類型調(diào)用不屬于自己的方法而引發(fā)的運(yùn)行時(shí)錯(cuò)誤济锄,一般在使用前進(jìn)行判斷,是不是能夠調(diào)用某方法:
if ([obj isKindOfClass:[Student class]]) {
// isKindOfClass , 判斷指定的對(duì)象是否是某一個(gè)類, 或者是某一個(gè)類的子類
[obj eat];
}
if ([obj isMemberOfClass:[Student class]]) {
// isMemberOfClass : 判斷指定的對(duì)象是否是當(dāng)前指定的類的實(shí)例
[obj eat];
}
new方法其實(shí)就是alloc + init
默認(rèn)情況下init(NSObject)什么都沒(méi)有做
alloc則初始化了isa實(shí)例變量霍转,使其指向了自己所在的類荐绝,其他所有實(shí)例變量的值都設(shè)為0
由于歷史原因,alloc會(huì)觸發(fā)allocWithZone:
以上引用內(nèi)容來(lái)自蘋果文檔避消。