封裝
類的封裝驯镊,就是在定義一個類時萤皂,為類中的成員變量設(shè)置調(diào)用范圍撒穷,使其不能直接被其他類訪問,同時裆熙,又提供了get和set方法端礼,分別用于獲取和設(shè)置成員變量的值禽笑。set和get方法是封裝的重要體現(xiàn)。
- set方法的語法格式
- (void) set變量名: (變量類型)變量名;
- get方法的語法格式
- (變量類型)變量名;
繼承
一個類繼承另一個類的語法格式為:
@interface 子類名: 父類名
子類可以對父類方法進行重寫蛤奥,但重寫方法后佳镜,父類的方法會被覆蓋,子類對象將無法訪問父類被重寫的方法凡桥。即使用super關(guān)鍵字蟀伸,用于訪問父類中的方法,語法格式如下:
[super 父類方法名: 參數(shù)列表];
若在對象方法中使用super關(guān)鍵字缅刽,那么就會調(diào)用父類中的對象方法啊掏,若在類方法中使用super關(guān)鍵字,那么就會調(diào)用父類的方法衰猛。
多態(tài)
在同一個方法中迟蜜,由于參數(shù)類型不同而導(dǎo)致執(zhí)行效果各異的現(xiàn)象就是多態(tài)。
對象的類型轉(zhuǎn)換
將子類對象當做父類使用時不需要任何的顯式聲明啡省,但此時不能通過父類變量去調(diào)用子類中的某些方法娜睛。
Animal *a1 = [[Dog alloc] init];
[a1 print];
父類對象若想調(diào)用子類的某些方法時,首先需要將父類對象強轉(zhuǎn)為子類對象卦睹。
Animal *a1 = [[Dog alloc] init];
Dog *d = (Dog *)a1;
[d print];
但以下這種方式還是錯誤的:
Cat *a1 = [[Dog alloc] init];
Dog *d = (Dog *)a1;
[d print];
因為Cat類型的指針和Dog類型初始化的對象不匹配畦戒,Dog類的實例對象無法被Cat類型的指針變量引用,因此结序,多態(tài)僅限于父類指針指向子類對象障斋。
self語法
避免使用self調(diào)用方法本身,會造成死循環(huán)笼痹。
- (void)test {
NSLog(@"調(diào)用test方法");
[self test];
}
以上這種是錯誤的配喳。
點語法
避免在set、get方法中使用點語法:
- (void)setAge: (int)age {
NSLog(@"調(diào)用set方法");
self.age = age;
}
因為self.age = age和[self setAge:age]是等價的凳干,導(dǎo)致死循環(huán)。
屬性
- 訪存方法名
一個屬性的訪問和存儲方法默認的方法名分別是propertyName和setPropertyName被济。有一個方法名name救赐,訪問和設(shè)置該屬性的方法分別為name和setName。但如果某些屬性是Boolean類型只磷,則需要在get方法上添加is作為前綴:
@property (nonatomic, getter = isOn) BOOL on;
內(nèi)存管理
在OC中经磅,變量存儲在棧中,對象存儲在堆中钮追,棧中的內(nèi)存空間系統(tǒng)會自動回收预厌,而堆中的內(nèi)存空間是動態(tài)分配的,系統(tǒng)很難進行自動回收元媚。
引用計數(shù)器操作
創(chuàng)建對象時轧叽,引用計數(shù)值為1苗沧,當進行一次retain操作后,引用計數(shù)值變?yōu)?炭晒,接著進行一次release操作待逞,引用計數(shù)值變?yōu)?,最后進行一次release操作后网严,會調(diào)用dealloc方法銷毀對象识樱。
在進行最后一次release操作后,沒有打印出引用計數(shù)值為0的原因是震束,對象在此刻的引用計數(shù)已經(jīng)變?yōu)?并且被釋放怜庸,如果還要求對象調(diào)用retainCount方法并顯示當前的引用計數(shù),就會出現(xiàn)野指針錯誤垢村。
在編寫代碼時休雌,如果對象已經(jīng)釋放,卻還要強行使用對象肝断,就會出現(xiàn)野指針錯誤杈曲,被釋放的對象就叫做僵尸對象。例如一個Person對象p胸懈,在創(chuàng)建時担扑,內(nèi)存會開辟一塊空間用于存儲該對象,同時棧內(nèi)也開辟一塊空間用于存儲指針變量p趣钱,且p指向內(nèi)存中創(chuàng)建的對象涌献。當它的計數(shù)器為0時,所指向的內(nèi)存空間就會被立可收回首有。但是對象沒有被馬上銷毀燕垃,這時的對象就會變成僵尸對象。雖然指向的內(nèi)存空間被收回了井联,但是對象沒有馬上消失卜壕,它所指向的內(nèi)存空間地址的指向還在。這時的這個指針就被稱為野指針烙常。
對象的內(nèi)存空間此時已經(jīng)不能訪問轴捎,若繼續(xù)訪問對象,就會出現(xiàn)EXC_BAD_ACCESS的錯誤提示蚕脏。為了防止這個對象被繼續(xù)使用侦副,需要對這個對象進行清空操作:
p = nil;