引用計(jì)數(shù)
OC是通過(guò)控制對(duì)象的引用計(jì)數(shù)來(lái)管理內(nèi)存的。
<h6>內(nèi)存管理原則:誰(shuí)申請(qǐng)金拒,誰(shuí)釋放</h6>
alloc / new / copy / mutableCopy 初始化對(duì)象并持有該對(duì)象蝌以,除此之外的初始化方法都不會(huì)持有該對(duì)象
retain 引用計(jì)數(shù) +1结澄,持有對(duì)象
release 引用計(jì)數(shù) -1嫡丙,釋放對(duì)象
dealloc 當(dāng)引用計(jì)數(shù)=0時(shí)恩袱,調(diào)用dealloc方法夫晌,銷毀對(duì)象
初始化對(duì)象雕薪,并持有該對(duì)象:
NSString *str = [[NSString alloc]init];
初始化對(duì)象,但不持有該對(duì)象:
id obj = [NSMutableArray array];
自己持有該對(duì)象
[obj retain];
autorelease
對(duì)象調(diào)用autorelease的方法:
1.生成并持有NSAutoreleasePool對(duì)象
2.將對(duì)象添加到NSAutoreleasePool中
3.廢棄NSAutoreleasePool對(duì)象
所有添加到NSAutoreleasePool中的對(duì)象晓淀,在NSAutoreleasePool廢棄時(shí)都會(huì)調(diào)用release方法
NSAutoreleasePool是在主線程的NSRunLoop中操作的所袁,當(dāng)調(diào)用大量的autorelease方法時(shí),只要不廢棄NSAutoreleasePool凶掰,調(diào)用autorelease的對(duì)象也不會(huì)釋放燥爷,會(huì)產(chǎn)生內(nèi)存不足的現(xiàn)象。
因此要在適當(dāng)?shù)牡胤匠钟胁U棄NSAutoreleasePool對(duì)象
autorelease實(shí)現(xiàn)
GNUstep是Cocoa的互換框架懦窘,雖然源代碼不相同前翎,但實(shí)現(xiàn)的方式是相似的。理解GNUstep框架有助于理解蘋果的源代碼奶赠。
<h5>GNUstep</h5>
<h6>autorelease方法的本質(zhì)是調(diào)用NSAutoreleasePool對(duì)象的addObject方法鱼填。</h6>
+ (void) addObject: (id) anObj
{
// pool變量取得正在使用的NSAutoreleasePool
NSAutoreleasePool *pool = 取得正在使用的NSAutoreleasePool對(duì)象;
if( pool != nil ){
//調(diào)用NSAutoreleasePool的對(duì)象addObject的實(shí)例方法
[pool addObject:anObj];
}else{
NSLog(@"NSAutoreleasePool對(duì)象非存在狀態(tài)下調(diào)用autorelease")毅戈;
}
}
addObject實(shí)例方法
當(dāng)調(diào)用autorelease方法時(shí)苹丸,該對(duì)象就會(huì)被添加到NSAutoreleasePool中的數(shù)組中。
- (void) addObject: (id) anObj
{
[array addObject: anObj];
}
通過(guò)drain廢棄NSAutoreleasePool
[pool drain];
廢棄drain的過(guò)程
蘋果的實(shí)現(xiàn)