1.內(nèi)存管理出現(xiàn)可能出現(xiàn)的問題
1.內(nèi)存泄露:不再需要的對象沒有釋放(例如當(dāng)內(nèi)存需要銷毀的時(shí)候撑教,但是依然存在一個(gè)強(qiáng)指針指向他朝墩,這時(shí)就會(huì)存在內(nèi)存泄露)
2.野指針:沒有進(jìn)行初始化的指針
3.懸空指針:一個(gè)指針指向一個(gè)被銷毀的對象
4.僵尸對象:過度釋放的對象
以上情況都可能導(dǎo)致系統(tǒng)奔潰
2.內(nèi)存管理的原則
1.自己生成的對象自己持有(自己持有即強(qiáng)指針指向生成的內(nèi)存空間)
2.非自己生成的對象自己也能持有
3.不再需要自己持有的對象時(shí)釋放(釋放只是引用計(jì)數(shù)減一,指向這塊內(nèi)存的強(qiáng)指針數(shù)減一伟姐,并不代表釋放內(nèi)存空間)
4.非自己持有的對象無法釋放
屏幕快照 2017-05-24 14.58.20.png
注:這里的alloc/retain/release/dealloc指的是NSObject中的alloc類方法/retain類方法/release類方法/dealloc類方法
屏幕快照 2017-05-24 15.13.30.png
2.1 自己生成并持有
alloc new copy mutableCopy
/*
*自己生成并持有對象:指向生成并持有對象的指針被賦值給obj
*/
id obj = [[NSObject alloc]init];
id obj1 = [NSObject new];
/*
*copy方法利于基于NSCopying方法約定收苏,由各類實(shí)現(xiàn)的copyWithZone:方法生成并持有對象的副本
*copy方法生成不可變的對象,mutableCopy生成可變的對象
*/
2.2 非自己生成的對象自己也可以持有
/*
*取得非自己生成并持有對象,但是自己不持有對象
*/
id obj = [NSMutableArray array];
/*
*持有對象
*/
[obj retain];
2.3 不再需要自己持有的對象時(shí)釋放
/*
*自己生成并持有對象
*/
id obj = [[NSObject alloc]init];
[obj release];
/*
*釋放對象
*指向?qū)ο蟮闹羔樢廊槐槐A粼趏bj中愤兵,貌似可以訪問鹿霸,但是對象一經(jīng)釋放絕對不可以訪問
*/
2.4 如果不是自己生成的對象并持有的對象不可以使用release釋放,但是如果用retain方法變?yōu)樽约撼钟兄蟾讶椋涂梢杂胷elease釋放
總結(jié):用alloc/retain/release/dealloc方法生成并持有的對象懦鼠,或者用retain方法持有的對象一但不在需要,務(wù)必使用release釋放掉屹堰。
3.系統(tǒng)方法仿寫
1.使用某個(gè)方法生成對象肛冶,并將其返回給該方法的調(diào)用方(仿alloc)
-(void)allocObject{
id obj = [[NSObject alloc]init];
return obj;
}
2.使用某個(gè)方法生成對象,并將其返回給該方法的調(diào)用方双藕,但是它不持有對象(仿array)
-(void)object{
id obj = [[NSObject alloc]init];
[obj autorelease];
return obj;
}
注:release立即釋放 autorelease對象放在autorelease pool中淑趾,超出范圍后自己釋放。