第05天OC語言(03):單個(gè)對象內(nèi)存管理

  • 不要等到明天,明天太遙遠(yuǎn),今天就行動(dòng)。
須讀:看完該文章你能做什么?

知道什么是MRC、ARC。
能夠清晰的知道單個(gè)對象的內(nèi)存管理。
dealloc方法的重寫樣式以及注意點(diǎn)

學(xué)習(xí)前:你必須會什么?(在這里我已經(jīng)默認(rèn)你具備C語言的基礎(chǔ)了)

什么是引用計(jì)數(shù)器


一、本章筆記
 一、Xcode4.2之后就是ARC了
 二、ARC 和 MRC
    ARC : automatic(自動(dòng)) Reference(引用) Counting(計(jì)數(shù)) 80%企業(yè)使用
        什么是自動(dòng)引用計(jì)數(shù)?
        不需要程序員管理內(nèi)容,編譯器會 在適當(dāng)?shù)牡胤?自動(dòng)給我們添加 release/retain等代碼
    注意點(diǎn) : OC中的ARC 和 Java中的垃圾回收機(jī)制不太一樣,Java的垃圾回收是系統(tǒng)干的,而OC中的ARC 是編譯器干的
    MRC : Manul(手動(dòng)) Reference(引用) Counting(計(jì)數(shù))  // 11、12年開發(fā)的時(shí)候
        什么是手動(dòng)引用計(jì)數(shù)?
        所有對象的內(nèi)容 都需要我們手動(dòng)管理,需要程序員 自己編寫 release / retain等代碼
 三、如何修改項(xiàng)目為MRC
    項(xiàng)目 -> Build Settings -> 搜索 automatic -> 找到 APPle Objective-C Automatic Reference Counting 設(shè)置為 NO即可
 四、retain、release、retainCount、dealloc
    retain : 引用計(jì)數(shù)器 + 1
    release : 引用計(jì)數(shù)器 -1 (注意 : release 僅僅是計(jì)數(shù)器 -1 , 并不代表銷毀/回收對象)
    retainCount : 計(jì)算一個(gè)對象的當(dāng)前的引用計(jì)數(shù)器 (獲取的數(shù)據(jù) 有可能不正確)
    dealloc : 對象引用計(jì)算器 為 0的時(shí)候 就會調(diào)用類里面的dealloc方法 (注意:在重寫dealloc方法的時(shí)候  [super dealloc] 一定要寫到所有代碼的最后)
 
 內(nèi)存管理的原則 就是有加有減
 也就是說, 一次alloc 對應(yīng) 一次 release , 一次retain 對應(yīng)一次 release

二、code
main.m
#pragma mark 03-單個(gè)對象內(nèi)存管理
#pragma mark 概念
/*
 一、Xcode4.2之后就是ARC了
 二、ARC 和 MRC
    ARC : automatic(自動(dòng)) Reference(引用) Counting(計(jì)數(shù)) 80%企業(yè)使用
        什么是自動(dòng)引用計(jì)數(shù)?
        不需要程序員管理內(nèi)容,編譯器會 在適當(dāng)?shù)牡胤?自動(dòng)給我們添加 release/retain等代碼
    注意點(diǎn) : OC中的ARC 和 Java中的垃圾回收機(jī)制不太一樣,Java的垃圾回收是系統(tǒng)干的,而OC中的ARC 是編譯器干的
    MRC : Manul(手動(dòng)) Reference(引用) Counting(計(jì)數(shù))  // 11、12年開發(fā)的時(shí)候
        什么是手動(dòng)引用計(jì)數(shù)?
        所有對象的內(nèi)容 都需要我們手動(dòng)管理,需要程序員 自己編寫 release / retain等代碼
 三、如何修改項(xiàng)目為MRC
    項(xiàng)目 -> Build Settings -> 搜索 automatic -> 找到 APPle Objective-C Automatic Reference Counting 設(shè)置為 NO即可
 四、retain、release、retainCount、dealloc
    retain : 引用計(jì)數(shù)器 + 1
    release : 引用計(jì)數(shù)器 -1 (注意 : release 僅僅是計(jì)數(shù)器 -1 , 并不代表銷毀/回收對象)
    retainCount : 計(jì)算一個(gè)對象的當(dāng)前的引用計(jì)數(shù)器 (獲取的數(shù)據(jù) 有可能不正確)
    dealloc : 對象引用計(jì)算器 為 0的時(shí)候 就會調(diào)用類里面的dealloc方法 (注意:在重寫dealloc方法的時(shí)候  [super dealloc] 一定要寫到所有代碼的最后)
 
 內(nèi)存管理的原則 就是有加有減
 也就是說, 一次alloc 對應(yīng) 一次 release , 一次retain 對應(yīng)一次 release
 */
#pragma mark - 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#import "Person.h"

#pragma mark - main函數(shù)
int main(int argc, const char * argv[])
{
 
    @autoreleasepool {
        // 只要?jiǎng)?chuàng)建一個(gè)對象 默認(rèn)引用計(jì)數(shù)器的值就是1
        Person *p = [[Person alloc]init];
        NSLog(@"retain count = %lu",[p retainCount]);
        
        // 只要給對象 發(fā)送一個(gè) retain消息, 對象的引用計(jì)數(shù)器 就會 + 1
        [p retain];
        
        NSLog(@"retain count = %lu",[p retainCount]);

        // 通過 指針變量p,給p指向的對象 發(fā)送一條release消息
        // 只要對象 接收到 release消息, 引用計(jì)數(shù)器就會-1
        [p release]; // release , 并不代表銷毀/回收對象, 僅僅是計(jì)數(shù)器-1
        
        NSLog(@"retain count = %lu",[p retainCount]);
        
         [p release];
        NSLog(@"---");
        
    }
//    [p setAge:20];
    
    
    return 0;
}

Person
>>>.h
#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

>>>.m
#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"Person dealloc");

    // 注意 : super dealloc 一定要寫到所有代碼的最后
    // 一定要寫在 dealloc方法 的最后面
    [super dealloc];

}

@end

Person的內(nèi)存分析

day05_03_01.png

一、設(shè)置項(xiàng)目為MRC


image.png

一、官方對retain、release、retainCount、dealloc的截圖

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

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

  • 內(nèi)存管理 簡述OC中內(nèi)存管理機(jī)制。與retain配對使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 2,086評論 1 16
  • 今天看到一篇不錯(cuò)的文章關(guān)于OC內(nèi)存管理的,轉(zhuǎn)載一下與你共享概述我們知道在程序運(yùn)行過程中要?jiǎng)?chuàng)建大量的對象,和其他高級...
    niceSYT閱讀 519評論 0 2
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配內(nèi)存(比如創(chuàng)建一個(gè)對象,會增加內(nèi)存占用)與...
    蚊香醬閱讀 5,825評論 8 119
  • 內(nèi)存管理 ARC處理原理 ARC是Objective-C編譯器的特性,而不是運(yùn)行時(shí)特性或者垃圾回收機(jī)制,ARC所做...
    b485c88ab697閱讀 11,350評論 3 47
  • 電影《我能說》里有老戲骨, 也有你們的老公金秀賢,幽默也有思想,還有諷刺,暫不劇透,資源在此拿走不謝。 http:...
    阿拉比卡納閱讀 185評論 0 1

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