一. 屬性的屬性
注: OC在Mac系統(tǒng)開發(fā)時(shí),支持垃圾回收機(jī)制,然而在iOS開發(fā)時(shí),僅支持引用計(jì)數(shù).不支持垃圾回收機(jī)制.
1. 屬性的讀寫屬性
a. readonly 用于約束屬性僅僅提供getter方法的聲明與實(shí)現(xiàn),為只讀屬性.
b. readwrite 表示屬性既提供setter方法的聲明與實(shí)現(xiàn),又提供給getter方法的審美觀
c. setter=,getter= 可以允許我們改變屬性默認(rèn)提供的setter與getter方法的方法名.為了達(dá)到調(diào)用時(shí)語句更加見名知意的效果.
2. 原子性控制屬性
a. atomic表示原子性屬性,在多線程訪問實(shí)例變量的環(huán)境下訪問實(shí)例變量的屬性是安全的,但是由于其安全性保護(hù)為加鎖和解鎖過程,所以會(huì)降低訪問效率(默認(rèn)值).
b. nonatomic表示非原子性屬性,在多線程環(huán)境下不安全,但是絕大數(shù)屬性訪問時(shí)并不考慮多線程問題,所以我們使用nonatomic可以提高訪問的效率.
二. 屬性的內(nèi)存管理
屬性的語義特性:在MRC工程中有:assign基本數(shù)據(jù)類型,retain對(duì)象類型(使對(duì)象的引用計(jì)數(shù)+1),copy對(duì)象類型(遵循<NSCopying>協(xié)議,實(shí)現(xiàn)copyWithZone的方法)
retain屬性修飾的時(shí)候,類的指定初始化中,對(duì)實(shí)例變量賦值的過程中則必須要進(jìn)行一次將形參值retain一次,(即為將其引用計(jì)數(shù)增1,從而不會(huì)導(dǎo)致野指針異常)
copy操作類似.
三. dealloc釋放實(shí)例變量
但凡屬性聲明時(shí)用到了retain或者copy修飾,則需要重寫dealloc方法在[super dealloc]被調(diào)用之前對(duì)對(duì)應(yīng)實(shí)例變量作release操作.
Eg:?
- (void)dealloc {
[_name release];
[_gender release];
[_student release];
NSLog(@"Person對(duì)象銷毀內(nèi)存");
[super dealloc];
}
四. 便利構(gòu)造器的內(nèi)存管理
便利構(gòu)造器內(nèi)部創(chuàng)建的對(duì)象在返回時(shí),需要通過autorelease方法延遲釋放所有權(quán),保證返回對(duì)象的可用性,也保證引用計(jì)數(shù)的增減平衡.按照內(nèi)存管理的基本準(zhǔn)則1,你擁有你所創(chuàng)建的對(duì)象,即使用alloc,new,copy和mutableCopy方法創(chuàng)建的對(duì)象.所以在外部使用便利構(gòu)造器創(chuàng)建對(duì)象不是我們所擁有的對(duì)象,在便利構(gòu)造器內(nèi)部已經(jīng)進(jìn)行了延遲釋放.
五. 集合的內(nèi)存管理
對(duì)數(shù)組,字典,集合中的對(duì)象:
當(dāng)對(duì)象從容器中移除時(shí),表示容器不再擁有該對(duì)象,則會(huì)對(duì)該對(duì)象做一次release操作.
容器被銷毀時(shí),保存在容器的所有對(duì)象都會(huì)被release一次.
六. KVC
為OC 2.0以前操作實(shí)例變量的方法.現(xiàn)如今可以通過點(diǎn)語法獲取對(duì)象的實(shí)例變量.
Eg:
//是用KVC進(jìn)行屬性的間接訪問
Person *aPerson = [[[Person alloc] init] autorelease];
//等效于aPerson.name = @"Carson";
[aPerson setValue:@"Carson" forKey:@"name"];
//等效于aPerson.gender = @"Male";
[aPerson setValue:@"Male" forKey:@"gender"];
Student *aStudent = [[[Student alloc] init] autorelease];
[aPerson setValue:aStudent forKey:@"student"];
[aPerson setValue:@"Tom" forKeyPath:@"student.name"];
NSLog(@"%@,%@,%@",aPerson.name,aPerson.gender,aPerson.student.name);
七. ARC
ARC是基于MRC的引用計(jì)數(shù)機(jī)制的,程序員只用調(diào)用alloc不必寫release方法,有編譯器自動(dòng)添加銷毀對(duì)象的代碼.與垃圾回收機(jī)制有本質(zhì)上的區(qū)別.