8 OC加强02

来源:互联网 发布:access 软件开发步骤 编辑:程序博客网 时间:2024/06/05 03:46

8 OC加强02

@class关键字

作用:
1. 防止循环引入(你作为我的属性,我作为你的属性)

本质:告诉编译器这是一个类,编译器不关心具体的实现.在.m文件中再引入对方的头文件.

循环retain

在MRC内存管理体制中,当两个对象相互引用时,都进行retain时,会发生内存泄露,都无法回收.

解决办法:一遍用retain,一端用assign(因为直接赋值dealloc中不用release).

自动释放池

                   `  @autoreleasepool{                   }   `

储存在自动释放池中的对象在自动释放池被销毁时,向里面的全部对象发送* 一条release消息 *

如何将对象加入自动释放池中?

在你想要在这个自动释放池中释放此对象,调用[p1 autorelease];方法

注意:
1. 对象可在池外面创建,在池内调用释放.
2. 只发送一条release消息
3. 调用几次autorelease方法,销毁时就发送几次release消息,这时可能会发生僵尸对象错误,不要这么写.写一次就可以了.

autorelease使用规范:类方法返回的对象在类方法中创建对象时,要求对象已经被autorelease了(不用在mian内手动调用autorelease),创建就已经被添加在释放池中了.

MRC结束


ARC机制(自动引用计数)

ARC机制:永远不要写retain,release,retainCount,autorelease.
可以重写delloc但是方法内不能调用[super dealloc];系统都帮我们解决了这些代码,我们不能写.

ARC下@property中的weak和strong参数.

只要没有强指针指向这个对象,这个对象就会被释放.

        __strong ZLPerson *p1 = [ZLPerson new];        __weak   ZLPerson *p2 = [ZLPerson new];        //弱指针出现就被释放

强弱都可以操作对象.

区别:ARC机制下,回收对象的基准不同.

  • ARC机制下@property参数retain不能写(MRC机制下使用:生成set方法是标准的MRC内存管理代码),但assign可用(表示非对象)

ARC下的循环引用

属性内都是强指针指向对方,就算申明的强指针都被释放了,他们对象内部的指针变量不会被释放.

解决办法:一个用strong,一个用weak.

知识点补充:一个对象只剩下弱指针指向,对象会被释放,这个弱指针会自动设置为nil.

MRC与ARC兼容

-fno-objc-arc

0 0
原创粉丝点击