引用計數(shù)
OC是通過控制對象的引用計數(shù)來管理內(nèi)存的。
<h6>內(nèi)存管理原則:誰申請,誰釋放</h6>
alloc / new / copy / mutableCopy 初始化對象并持有該對象,除此之外的初始化方法都不會持有該對象
retain 引用計數(shù) +1,持有對象
release 引用計數(shù) -1,釋放對象
dealloc 當(dāng)引用計數(shù)=0時,調(diào)用dealloc方法,銷毀對象
初始化對象,并持有該對象:
NSString *str = [[NSString alloc]init];
初始化對象,但不持有該對象:
id obj = [NSMutableArray array];
自己持有該對象
[obj retain];
autorelease
對象調(diào)用autorelease的方法:
1.生成并持有NSAutoreleasePool對象
2.將對象添加到NSAutoreleasePool中
3.廢棄NSAutoreleasePool對象
所有添加到NSAutoreleasePool中的對象,在NSAutoreleasePool廢棄時都會調(diào)用release方法

NSAutoreleasePool是在主線程的NSRunLoop中操作的,當(dāng)調(diào)用大量的autorelease方法時,只要不廢棄NSAutoreleasePool,調(diào)用autorelease的對象也不會釋放,會產(chǎn)生內(nèi)存不足的現(xiàn)象。
因此要在適當(dāng)?shù)牡胤匠钟胁U棄NSAutoreleasePool對象
autorelease實現(xiàn)
GNUstep是Cocoa的互換框架,雖然源代碼不相同,但實現(xiàn)的方式是相似的。理解GNUstep框架有助于理解蘋果的源代碼。
<h5>GNUstep</h5>
<h6>autorelease方法的本質(zhì)是調(diào)用NSAutoreleasePool對象的addObject方法。</h6>
+ (void) addObject: (id) anObj
{
// pool變量取得正在使用的NSAutoreleasePool
NSAutoreleasePool *pool = 取得正在使用的NSAutoreleasePool對象;
if( pool != nil ){
//調(diào)用NSAutoreleasePool的對象addObject的實例方法
[pool addObject:anObj];
}else{
NSLog(@"NSAutoreleasePool對象非存在狀態(tài)下調(diào)用autorelease");
}
}
addObject實例方法
當(dāng)調(diào)用autorelease方法時,該對象就會被添加到NSAutoreleasePool中的數(shù)組中。
- (void) addObject: (id) anObj
{
[array addObject: anObj];
}
通過drain廢棄NSAutoreleasePool
[pool drain];
廢棄drain的過程

蘋果的實現(xiàn)

