zoukankan      html  css  js  c++  java
  • oc42--引用计数器

    /*  main.m
    
        堆里面的内存释放是根据引用计数器,所以就是操作引用计数器。
        创建一个对象,对象里面就有一个引用计数器,有多少指针指向它。
        引用计数器为0就释放。任何一个对象初始化时就是1,所以
        {
            Person *p = [[Person alloc] init]
        }
        出了这行代码p销毁了,但是Person对象里面的计数器初始化时就是1,所以计数器不为0,就永远销毁不了。
        给对象发送retain消息引用计数器就会+1,给对象发送release消息引用计数器就会-1。
        retainCount查看对象的引用计数器个数,retainCount获取到的引用计数器个数不准确。
        当一个对象的引用计数器为0时候,会给对象发送dealloc消息,表示对象将会销毁。
     
    */
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    /*
     
     ARC: Automatic(自动) Reference(引用) Counting(计数)
     什么是自动引用计数? 
     不需要程序员管理内容, 编译器会在适当的地方自动给我们添加release/retain等代码。
     注意点: OC中的ARC和java中的垃圾回收机制不太一样, java中的垃圾回收是系统干得, 而OC中的ARC是编译器干得。
     
     MRC: Manul(手动) Reference(引用) Counting(计数)
     什么是手动引用计数?
     所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码。11年12年ios是需要手动释放。
     
     内存管理的原则就是有加就有减
     也就是说, 一次alloc对应一次release, 一次retain对应一次relese
     
     */
    int main(int argc, const char * argv[]) {
    
        @autoreleasepool {
            // 只要创建一个对象默认引用计数器的值就是1
            Person *p = [[Person alloc] init];
            
            NSLog(@"retainCount = %lu", [p retainCount]); // 1,  工程-->Build Settings 把ARC设置YES就不能写这些代码了。
            
            // 只要给对象发送一个retain消息, 对象的引用计数器就会+1
            [p retain];
            
            NSLog(@"retainCount = %lu", [p retainCount]); // 2
            
            [p tt];
            
            // 通过指针变量p,给p指向的对象发送一条release消息
            // 只要对象接收到release消息, 引用计数器就会-1
            // 只要一个对象的引用计数器为0, 系统就会释放对象
            [p release];
            // 需要注意的是: release并不代表销毁回收对象, 仅仅是计数器-1
            NSLog(@"retainCount = %lu", [p retainCount]); // 1
            
            [p release]; // 0, Person dealloc,调用Person的dealloc方法。
            
            [p tt];
            
            NSLog(@"retainCount = %lu", [p retainCount]);//打印不准确
            NSLog(@"--------");
        }
        //[p setAge:20];   //p已经就释放了
        return 0;
    }
    //  Person.h
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    @property int age;
    
    -(void)tt;
    @end
    //  Person.m
    
    #import "Person.h"
    
    @implementation Person
    
    - (void)dealloc
    {
        NSLog(@"Person dealloc");
        // 注意:super dealloc一定要写到所有代码的最后
        // 一定要写在dealloc方法的最后面,  对象释放时做一些扫尾的工作。 不能手动调用,只能系统调用。
        [super dealloc];
    }
    -(void)tt{
        NSLog(@"ssssss");
    }
    @end
  • 相关阅读:
    js 自定义方法 实现停留几秒 sleep
    java 通过sftp服务器上传下载删除文件
    iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
    iOS JavaScriptCore使用
    UIWebView和WKWebView的使用及js交互
    WKWebView的新特性与使用
    OC与JS的交互详解
    iOS开发支付集成之微信支付
    iOS开发之支付宝集成
    React-Native学习指南
  • 原文地址:https://www.cnblogs.com/yaowen/p/7419047.html
Copyright © 2011-2022 走看看