一穿撮、【掌握】點(diǎn)語(yǔ)法的介紹和使用
1.點(diǎn)語(yǔ)法是編譯器特性达传,當(dāng)編譯器看到對(duì)象使用點(diǎn)語(yǔ)法嘀掸,會(huì)自動(dòng)把點(diǎn)語(yǔ)法轉(zhuǎn)換為調(diào)用set或get方法的形式
2.使用
Student *s = [Student new];
s.age = @"daa";
Int age = s.age;
3.本質(zhì):就是set或者get方法
遇見(jiàn)s.age = 10;形式稀拐,就會(huì)自動(dòng)展開(kāi)為:[s setAge:10];
遇見(jiàn)int a = s.age啸澡;形式拐邪,就會(huì)自動(dòng)展開(kāi)為:int a = [s age];
4.注意事項(xiàng)
1)- (void)setAge:(int)age
{
Self.age = age;//死循環(huán)
}
2)- (int)age
{
Return self.age;
}
注意點(diǎn):什么時(shí)候會(huì)生成set方法什么時(shí)候會(huì)生成get方法慰毅?
如果有賦值運(yùn)算符,生成set方法扎阶,否則生成get方法汹胃。
二、【了解】@property關(guān)鍵字介紹和使用
用@property取 代set和get方法的聲明
用@synthesize取代set和get方法的實(shí)現(xiàn)(會(huì)生成一個(gè)私有的成員變量)
@synthesize name
能夠生成如下代碼:
1.@synthesize生成的第一部分代碼
{
NSString *name;
}
2.-(void)setName:(NSString *)name
{
Self->name = name;
}
-(NSString *)name
{
Return self->name;
}
//如果成員變量中已有name變量东臀,則不會(huì)生成私有name變量着饥,直接賦值
問(wèn)題:想要給自己已有的帶下劃線的成員變量進(jìn)行賦值,怎么辦惰赋?
需要給@synthesize指定宰掉,告訴該賦值給誰(shuí)。
@synthesize name = _name;
他就知道赁濒,賦值給_name;
三轨奄、【掌握】property的增強(qiáng)用法
@property的組合用法:
只要同種類(lèi)型,就可以寫(xiě)在一起拒炎,用逗號(hào)分隔(建議一個(gè)成員變量寫(xiě)一行)
比如:
@property int age,height,weight;
@property NSString *name;
@synthesize的組合用法:
不區(qū)分?jǐn)?shù)據(jù)類(lèi)型挪拟,只要被@property修飾,就可以卸載一起击你,用逗號(hào)進(jìn)行分隔
比如:
@synthesize age = _age,height = _height,weight =
_weight,name = _name;
@property的加強(qiáng)用法
同時(shí)-->
生成set和get方法的聲明
生成set和get方法的實(shí)現(xiàn)
生成帶下劃線的成員變量
注意事項(xiàng):
當(dāng)用戶(hù)手動(dòng)重寫(xiě)了set方法時(shí)玉组,@property會(huì)生成get方法和帶下劃線的成員變量
當(dāng)用戶(hù)手動(dòng)重寫(xiě)了set和get方法時(shí),@property不會(huì)生成帶下劃線的成員變量
當(dāng)用戶(hù)手動(dòng)重寫(xiě)了get方法時(shí)丁侄,@property會(huì)生成set方法和帶下劃線的成員變量
三球切、【理解】id類(lèi)型及應(yīng)用場(chǎng)景
id出廠自帶*?? id cat = [Cat new];
id萬(wàn)能指針,能夠指向任何OC對(duì)象
NSObject:是所有類(lèi)的父類(lèi)吨凑,也就是基類(lèi)鸵钝”涮樱可以指向任何OC對(duì)象
區(qū)別:編譯器對(duì)NSObject做類(lèi)型檢測(cè)揽乱,但是不對(duì)id做類(lèi)型檢測(cè)
用@property id obj凰棉;其中obj可以賦值任何OC對(duì)象,如:
s.obj? ? ? = @"obj可以賦值任何OC對(duì)象";
四派桩、動(dòng)態(tài)類(lèi)型檢測(cè)
動(dòng)態(tài)綁定
在objective-c中,一個(gè)對(duì)象內(nèi)是否調(diào)用指定的方法不是由編譯器決定而是由運(yùn)行時(shí)決定袜啃,這被稱(chēng)作是方法的動(dòng)態(tài)綁定。
在objective-c中,對(duì)象不是調(diào)用方法,而是接收消息抵栈,消息表達(dá)式為:
[reciver message];
運(yùn)行時(shí)系統(tǒng)首先確定接受者的類(lèi)型(動(dòng)態(tài)類(lèi)型識(shí)別)告材,然后根據(jù)消息名在類(lèi)的方法列表里選擇相應(yīng)的方法執(zhí)行,所以在源代碼里消息也稱(chēng)為選擇器SEL。
消息函數(shù)的作用:
首先通過(guò)第一個(gè)參數(shù)的receiver杠览,找到它的isa指針管钳,然后在isa指向的Class對(duì)象中使用第二個(gè)參數(shù)SEL查找方法;
如果沒(méi)有找到,就是用當(dāng)前Class對(duì)象中的新的isa指針到上一級(jí)的父類(lèi)的Class對(duì)象中查找焰手;
當(dāng)找到方法后怀喉,再一句receiver中的self指針找到當(dāng)前的對(duì)象聊闯,調(diào)用當(dāng)前對(duì)象的具體實(shí)現(xiàn)方法(IMP)拴泌,然后傳遞參數(shù)箭昵,調(diào)用實(shí)現(xiàn)方法
假如一只找到NSObject的Class對(duì)象,也沒(méi)有找到你調(diào)用的方法回季,就會(huì)報(bào)告不能識(shí)別家制,發(fā)送消息的錯(cuò)誤
動(dòng)態(tài)監(jiān)測(cè)的方法
?1)判斷對(duì)象是不是指定類(lèi)的對(duì)象或者指定類(lèi)的子類(lèi)對(duì)象
原型:-(BOOL)isisKindOfClass:(Class)aClass;
? ? BOOL res = [son
isKindOfClass:dog];
?2)判斷對(duì)象是不是一個(gè)特定類(lèi)型的對(duì)象,不包括子類(lèi)
原型:-(BOOL)isisMemberOfClass:(Class)aClass;
? ? BOOL res = [son
isMemberOfClass:dog];
?3)判斷一個(gè)類(lèi)是不是另外一個(gè)類(lèi)的子類(lèi)
原型:+(BOOL)isSubclassOfClass:(Class)aClass;
?4)判斷對(duì)象中是否能影響指定的方法,這個(gè)最常用
原型:-(BOOL)respondsToSelector:(Class)aClass;
? ? BOOL res = [son
respondsToSelector:s];
?5)判斷類(lèi)中是否能響應(yīng)指定方法
原型:+(BOOL)instancesRespondToSelector:(SEL)aSelector;
五、響應(yīng)方法
Dog *d = [Dog new];
[d performSelector:@selector(run)];
//帶一個(gè)參數(shù)的
[d performSelector:@selector(eat:)withObject:@"www"];
六泡一、構(gòu)造方法的概念
重點(diǎn):自定義構(gòu)造方法颤殴。
構(gòu)造方法:用來(lái)初始化對(duì)象實(shí)例變量值
?new一下,就能有一個(gè)對(duì)象
?1.分配內(nèi)存空間 ? ? +
alloc
?2.初始化. ? ? ?
? - init
?構(gòu)造方法:指的就是初始化方法
需求:創(chuàng)建10只狗,讓這些狗在創(chuàng)建時(shí),所有的年齡都是1歲.
可以通過(guò)重寫(xiě)init方法
?- (instancetype)init
?{
?self = [super init];
?if (self) {
?//子類(lèi)的初始化等等其他操作,都在這個(gè)花括號(hào)里面做
?_age = 1;
?}
?return self;
?}
Dog *d = [[Dog alloc] init];
說(shuō)明;
1)init方法就是構(gòu)造方法,是用來(lái)初始化對(duì)象的方法鼻忠,注意這是一個(gè)對(duì)象方法涵但,以減號(hào)開(kāi)頭。默認(rèn)初始化完畢后粥烁,所有成員變量的值為0
2)alloc
向某個(gè)類(lèi)發(fā)送alloc消息的結(jié)果
為該類(lèi)分配內(nèi)存贤笆,以存放該類(lèi)的全部實(shí)例變量
還將這塊內(nèi)存區(qū)域全部初始化為0
注意:
一個(gè)剛剛分配的對(duì)象并不能立即使用
需要先初始化該對(duì)象蝇棉,然后才能使用它
但由于未進(jìn)行初始化讨阻,隨后可能出現(xiàn)一些不可預(yù)測(cè)的行為
初始化成員變量
OC對(duì)象初始化為nil
C語(yǔ)言指針初始化為:NULL
基本數(shù)據(jù)類(lèi)型初始化為:0
誰(shuí)調(diào)用self所在的方法,self就指向誰(shuí)篡殷,self就是誰(shuí)
構(gòu)造方法使用注意
子類(lèi)擁有的成員變量包括自己的成員變量以從父類(lèi)繼承而來(lái)的成員變量钝吮,在重寫(xiě)構(gòu)造方法的時(shí)候應(yīng)該首先對(duì)從父類(lèi)繼承而來(lái)的成員變量先進(jìn)行初始化
原則:先初始化父類(lèi)的,再初始化子類(lèi)的
重寫(xiě)構(gòu)造方法的目的:為了讓對(duì)象方法一創(chuàng)建出來(lái),成員變量就會(huì)有一定的固定的值奇瘦。
注意點(diǎn):
先調(diào)用父類(lèi)的構(gòu)造方法[super init];
在進(jìn)行子類(lèi)內(nèi)部成員變量的初始化棘催。
自定義構(gòu)造方法
? 自定義構(gòu)造方法的規(guī)范
一定是對(duì)象方法,以減號(hào)開(kāi)頭
返回值一般是id(instancetype)類(lèi)型
方法名一定以initWith開(kāi)頭
//自定義構(gòu)造方法
//命名的時(shí)候:init后邊接了單詞首字母必須大寫(xiě)
- (instancetype)initWithName:(NSString*)name andAge:(int)age;
//實(shí)現(xiàn)
- (instancetype)initWithName:(NSString*)name andAge:(int)age
{
? ? //必須調(diào)回父類(lèi)的構(gòu)造方法
? ? if(self = [super init])
? ? {
? ? ? ? _name = name;
? ? ? ? _age = age;
? ? }
return self;
}