1.property
@property是編譯器的指令什么是編譯器的指令,編譯器指令就是用來(lái)告訴編譯器要做什么
@property告訴編譯器聲明屬性的訪問(wèn)器(getter/setter)方法
好處:免去我們手工書(shū)寫(xiě)get和set方法繁瑣的代碼
用法:@property類(lèi)型方法名
尤其注意:@property只能寫(xiě)在@interface @end中,
@property用來(lái)自動(dòng)生成成員變量的get/set方法聲明(xcode4.4以前)告訴property要生成的get/set方法聲明的成員變量類(lèi)型是什么告訴property要生成的get/set方法是哪個(gè)屬性的,屬性名稱(chēng)去掉下劃線(xiàn)
2,@synthesize
@synthesize是在m文件中定義set和get方法的實(shí)現(xiàn)。
注意:
如果@synthesize變量名要先在.h文件中聲明
@property int age;
.h -(void)setAge:(int)age; -(int)age;
.m -(void)setAge:(int)age{
slef->age = age; }
-(int)age{
return age; }
@synthesize age
3.@property增強(qiáng)使用
幫助我們自動(dòng)生成get/set方法的聲明,幫助我們自動(dòng)生成get/set方法的實(shí)現(xiàn)
-(void)setScore:(int) score{
_score = score;
}
-(int)score{
return _score
}
@property下重寫(xiě)get和set方法
1)如果手動(dòng)實(shí)現(xiàn)了set方法,那么編譯器就只生成get方法和成員變量; 2)如果手動(dòng)實(shí)現(xiàn)了get方法,那么編譯器就只生成set方法和成員變量; 3)如果set和get方法都是手動(dòng)實(shí)現(xiàn)的,那么編譯器將不會(huì)生成成員變量,并且報(bào)錯(cuò)。
4.動(dòng)態(tài)類(lèi)型和靜態(tài)類(lèi)型
多態(tài):允許不同的類(lèi)定義相同的方法。
動(dòng)態(tài)類(lèi)型:程序直到執(zhí)行時(shí)才能確定所屬的類(lèi)。
靜態(tài)類(lèi)型:將一個(gè)變量定義為特定類(lèi)的對(duì)象時(shí),使用的是靜態(tài)形態(tài)。
5.id類(lèi)型
id是一種通用的對(duì)象類(lèi)型,它可以用來(lái)存儲(chǔ)屬于任何類(lèi)的對(duì)象也可以理解為萬(wàn)能指針
注意在id的定義中,已經(jīng)包好了*號(hào)。id指針只能指向oc的對(duì)象。
id類(lèi)型的定義
Typedef struct objc object{
Class isa; } *id;
Animal *animal = [Animal new]; //狗的類(lèi),狗繼承自動(dòng)物
Dog *dog = [Dog new]; //貓的類(lèi),貓繼承自動(dòng)物
Cat *cat = [Cat new]; //定義id類(lèi)型
id obj = cat; //id obj = dog; [obj run];
6.構(gòu)造方法的概念
構(gòu)造方法:用來(lái)初始化對(duì)象實(shí)例變量值的方法,是個(gè)對(duì)象方法,-開(kāi)頭重寫(xiě)構(gòu)造方法的目的:為了讓對(duì)象創(chuàng)建出來(lái),成員變量就會(huì)有一些固定的值
調(diào)用:
完整的創(chuàng)建一個(gè)可用的對(duì)象:Person *p=[Person new]; new方法的內(nèi)部會(huì)分別調(diào)用兩個(gè)方法來(lái)完成3件事情:
(1)使用alloc方法來(lái)分配存儲(chǔ)空間(返回分配的對(duì)象); (2)使用init方法來(lái)對(duì)對(duì)象進(jìn)行初始化。(3)返回對(duì)象的首地址
可以把new方法拆開(kāi)如下: (1).調(diào)用類(lèi)方法+alloc分配存儲(chǔ)空間,返回未經(jīng)初始化的對(duì)象
Person *p1=[Person alloc]; (2).調(diào)用對(duì)象方法-init進(jìn)行初始化,返回對(duì)象本身
Person *p2=[p1 init]; (3).以上兩個(gè)過(guò)程整合為一句:
Person *p=[[Person alloc] init];
尤其注意:
(1)子類(lèi)擁有的成員變量包括自己的成員變量以及從父類(lèi)繼承而來(lái)的成員變量,在重寫(xiě)構(gòu)造方法的時(shí)候應(yīng)該首先對(duì)從父類(lèi)繼承而來(lái)的成員變量先進(jìn)行初始化。
(2)原則:先初始化父類(lèi)的,再初始化子類(lèi)的。(3)重寫(xiě)構(gòu)造方法的目的:為了讓對(duì)象方法一創(chuàng)建出來(lái),成員變量就會(huì)有一些固定的值。
(4)注意點(diǎn):
(1)先調(diào)用父類(lèi)的構(gòu)造方法[super init]; (2)再進(jìn)行子類(lèi)內(nèi)部成員變量的初始化。