zoukankan      html  css  js  c++  java
  • iOS学习第四天杂记--Objective-C中的内存管理

      先说明下,原文为青玉伏案写的。我这只是学习而已。

      OC中的内存管理。

      OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象时,会将该对象的引用计数器加1(通过retain来实现);当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现);当计数器为0时,该对象占用的内存空间会被收回。在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值。

      Tips:测试时如若需要用到retainCount,需要将xcode中的相关设置修改。

    将YES改为NO即可。

      

      1. 用可变的数组结合着可变的字符串来观察一下retainCount的变化。

        ​    ​      ​(1).先创建一个可变数组对象,在创建一个可变字符串对象--此时可变字符串的retainCount为1;

        ​    ​      ​(2).然后往可变数组里添加可变的字符串,观察可变字符串的retainCount的变化--往可变数组中每加一个对象,数组的retainCount +1

        ​    ​      ​(3).在可变数组中移除一个str,观察retainCount的变化--可变数组的retainCount -1。

            //用可变的数组来测试内存的访问
            NSMutableArray *array = [NSMutableArray arrayWithCapacity:3];
            //可变的字符串
            NSMutableString *str = [[NSMutableString alloc] initWithString:@"aa"];
            //这时的retainCount
            NSLog(@"新建str时的strRetain = %d",(int)[str retainCount]);
            [array addObject: str];
            [array addObject: str];
            NSLog(@"添加两个str元素后的strRetain = %d", (int)[str retainCount]);
            
            [array removeObjectAtIndex: 0];
            NSLog(@"移除一个元素后strRetain = %d", (int)[str retainCount]);

    ​  2.NSString的retainCount的变化

        ​    ​    ​用NSString声明的字符串变量的retainCount变化由你初始化字符串时的方式决定

        ​    ​    ​1. 用NSString *str = @"ludashi";定义变量

        ​    ​    ​    ​用上面的方法定义的字符串是常量字符串,他的retianCount为-1或不定,不会随着retian或者release变化而变化

       

    Objective-C中得ARC(Automatic Reference Counting)

        ​    1.​ARC中应注意的问题:

        ​    ​    ​(1). 不能显式调用dealloc语句, 或者实现或调用retain, release, retianCount 和 autorelease等方法。

        ​    ​    ​(2).不能调用@selector (retain) ,@selector (release)等;

        ​    ​    ​(3).不能使用NSAutoreleasePool对象, 用@autoreleasepool块来代替;

        ​    ​    ​(4).不能用开头new的名称来定义一个属性,除非你定义一个别的getter名称。

        ​    ​2.ARC特性

        ​    ​    ​ARC增加了新的属性定义关键字,strong来代替retain,表示强引用。用weak来代替assign表示弱引用。

    -----------------------------------------(我是分割线)

    Object-C中的类目,扩展,http://blog.csdn.net/wuleihenbang/article/details/9076853

    Object-C中的协议和代理(委托)设计模式:http://blog.csdn.net/wuleihenbang/article/details/9076579

    -------------------(我是分割线)

    Objective-C中的深拷贝和浅拷贝

    -----------我是分割线(09-17更新)

    单个对象的内存泄漏问题:

    情况1: 创建完成 使用之后,没有release

        Dog *d = [[Dog alloc] init];

        NSLog(@"%lu", d.retainCount);

    情况2: 没有遵守内存管理的原则(谁创建,谁release)

    情况3: 不当的使用了nil,例如[nil 方法]这样,是没有效果的。

    情况4: 在方法中对传入的对象进行了retain(违反了内存管理原则)。

  • 相关阅读:
    配置 dovecat 的 PAM
    通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃
    路由器漏洞复现分析第二弹:CNVD-2018-01084
    路由器漏洞复现分析第三弹:DVRF INTRO题目分析
    重新认识被人遗忘的HTTP头注入
    [转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析
    HOOK大法实现不修改程序代码给程序添加功能
    老树开新花:DLL劫持漏洞新玩法
    分享三个USB抓包软件---Bus Hound,USBlyzer 和-USBTrace
    网易云音乐PC客户端加密API逆向解析
  • 原文地址:https://www.cnblogs.com/wmx-rj/p/4726670.html
Copyright © 2011-2022 走看看