在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
引用计数:通过给对象计数标志,来判断是否释放对象 注:只能释放自己持有的对象 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 关于显示转为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
|
请发表评论