zoukankan      html  css  js  c++  java
  • objective-c高级编程 笔记

    引用计数:通过给对象计数标志,来判断是否释放对象

    注:只能释放自己持有的对象

    id obj = [NSMutableArray array]

    如obj这个对象,并不是你所持有的对象,所以你无法进行释放

    但是你可以通过retain来持有这个对象

    [obj retain]
    [obj release]

    什么样的对象不是你所持有的,比如你调用了

    [obj autorelease]

    使用autorelease会让你的对象注册到autoreleasepool中,在pool结束时,自动调用release

    现在说说计数

    通过alloc或者retain,都能让这个对象的引用计数加一

    调用release后,引用计数减一

    每次调用release,都会对引用计数进行判断,若减一后引用计数为0

    则会调用dealloc废弃对象

    [self dealloc]

    在ios中,苹果通过散列表(哈希表)管理引用计数

    autorelease的使用

    //未使用ARC
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    id obj = [[NSObject alloc] init];
    [obj autorelease];
    [pool drain];
    
    //使用ARC
    @autoreleasepool {
        id __autoreleasing obj = [[NSObject alloc] init];
    }

    __strong

    表示对对象的强引用

    {
        id __strong obj = [[NSObject alloc] init];
        //等同于 id obj = [[NSObject alloc] init];
        //obj为强引用,自己持有对象
    }
        //obj超出其作用域,强引用失效,自动释放自己持有的对象,对象的所有者不在,废弃该对象

    在强引用中,可能造成互相强引用和对自身的强引用,造成内存的泄露

    //这里写个对自身的强引用
    {
        id test = [[Test alloc] init];
        //Test 为自己定义的一个类
        [test setObejct:test];
        //setObejct 是Test中的一个方法,给属性obj(id __strong obj)赋值
    }
       //超出作用域,test被释放
       //但test里的属性obj被赋值为test,test被释放,里面的属性也要被释放因此test被再次释放,因此发生了内存的泄露

    这时就需要弱引用

    __weak

    表示对对象的弱引用,弱引用不能持有对象的实例

    id __weak obj = [[NSObject alloc] init];
    //这类在编译器中都会报错,因为弱引用无法持有对象,生成的对象会立即被释放,也就是对象的引用计数并未增加,还是0
    id __strong obj1 = [[NSObject alloc] init];
    id __weak obj2 = obj1;
    //这个就没问题了,对象被obj1引用,并没有立即释放

    所以刚刚的问题,只要将刚刚的Test类的属性设为id __weak obj就行了

    ARC的规则

    第一、不能使用retain/release/retainCount/autorelease
    使用ARC,内存管理由编译器来负责,无需写上面关键词
    第二、在ARC环境下,使用alloc/new/copy/mutableCopy来生成/持有对象
    copy/mutableCopy的使用需要copyWithZone的支持,如果没有,则不支持copy/mutableCopy
    第三、不能显示调用 dealloc
    第四、使用@autoreleasepool块来替代NSAutorealeasePool
    第五、不能使用区域NSZone
    第六、对象变量不能作为C语言结构体的成员
    第七、显示转换id和void *
    第七、不能使用NSAllocateObject/NSDeallocateObject

    关于显示转为id和void *,要知道core foundation h和bridge方面的知识

    参考博客http://blog.csdn.net/annkey123/article/details/8271867

    也就是core foundation其实是用c写的,提供底层的接口,为什么需要它呢,因为这样可以让各种不同的框架联系起来

    这里有个关于这方面的历史http://www.udpwork.com/item/10889.html

    id obj; 等于 id __strong obk;

    id *obj; 等于 id __autoreleasing *obj;

    所以在声明一个强引用的数组时,需要这样定义 id __strong *array


    保留。。。。。一脸懵逼


    多线程:http://www.jianshu.com/p/2d57c72016c6

    还有个信号量:http://www.jianshu.com/p/c5a4a3fce93d

  • 相关阅读:
    第三百九十一、二、三、四、五、六、七天 how can I 坚持
    第三百九十天 how can I 坚持
    第三百八十九天 how can I 坚持
    POJ 1745:Divisibility 枚举某一状态的DP
    POJ 1502:MPI Maelstrom Dijkstra模板题
    POJ 1160:Post Office 邮局经典DP
    POJ 1062:昂贵的聘礼
    POJ 1125:Stockbroker Grapevine
    POJ 1236:Network of Schools
    POJ 2186:Popular Cows Tarjan模板题
  • 原文地址:https://www.cnblogs.com/dj3839/p/6798820.html
Copyright © 2011-2022 走看看