內(nèi)存管理

引用計數(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方法

屏幕快照 2017-02-20 下午5.21.14.png

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的過程

屏幕快照 2017-02-20 下午6.07.54.png

蘋果的實現(xiàn)

屏幕快照 2017-02-20 下午6.10.55.png

屏幕快照 2017-02-20 下午6.11.13.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 自動引用計數(shù) 自動引用計數(shù):指內(nèi)存管理中對引用采取自動計數(shù)的技術(shù)。 內(nèi)存管理/引用計數(shù) 持有對象引起引用計數(shù)加...
    南京小伙閱讀 1,420評論 2 3
  • 前言 從我開始學(xué)習(xí)iOS的時候,身邊的朋友、網(wǎng)上的博客都告訴我iOS的內(nèi)存管理是依靠引用計數(shù)的,然后說引用計數(shù)大于...
    蓋世英雄_ix4n04閱讀 659評論 0 1
  • 一、內(nèi)存管理的思考方式下文會常用到的術(shù)語解釋生成對象:創(chuàng)建對象持有對象:引用計數(shù)+1釋放對象:引用計數(shù)-1廢棄對象...
    iOSUI拖拽工程師閱讀 1,637評論 0 3
  • 貌似每個iOS開發(fā)者都有一篇屬于自己的內(nèi)存管理,記錄了自己對內(nèi)存管理理解的深度以及廣度,所以我也來記錄一下我的理解...
    Bugfix閱讀 2,385評論 0 3
  • 29.理解引用計數(shù) Objective-C語言使用引用計數(shù)來管理內(nèi)存,也就是說,每個對象都有個可以遞增或遞減的計數(shù)...
    Code_Ninja閱讀 1,727評論 1 3

友情鏈接更多精彩內(nèi)容