MRC和ARC之间的区别

block是不是一个对象?是一个对象,苹果官方文档有说明(搜索working with block)

如何判断当前文件是MRC,还是ARC

1.dealloc能否调用super,只有MRC才能调用super

2.能否使用retain,release.如果能用就是MRC

ARC管理原则:只要一个对象没有被强指针修饰就会被销毁,默认局部变量对象都是强指针,存放到

堆里面,只是局部变量的强指针会在代码块结束后释放,对应所指向的内存空间也会被销毁

MRC了解开发常识:1.MRC没有strong,weak,局部变量对象就是相当于基本数据类型

2.MRC给成员属性赋值,一定要使用set方法,不能直接访问下划线成员属性赋

值,因为使用下划线是直接赋值(如_name = name),而set方法会做以下的事情

- (void)setRoom:(Room*)room

{

/*对旧房间进行release,需要注意的是,第一次对_room进行release没有任何

变化,因为刚开始_room的值是nil,对一个空指针release是没有影响的,先判断

是否为同一房间,因为房间相同就不需要release和retain,只有房间不同,才需要对

旧值release,对新值retain

*/

if(_room!= room) {

[_roomrelease];

_room= [roomretain];

}

}

总结:只要block没有引用外部局部变量,不管是在MRC还是ARC中,block都放在全局区(静态区

static)

MRC:管理block

只要Block引用外部局部变量,block放在栈里面.

block只能使用copy,不能使用retain,使用retain,block还是在栈里面

当block代码块结束后就会被释放,这样就无法在其它方法中调用block了

ARC:管理block

只要block引用外部局部变量,block放在堆里面

block使用strong.最好不要使用copy,因为copy的set方法并不是直接赋值,而是在set

方法中会进行进一步的判断,判断是否需要重新开辟内存以及深拷贝,浅拷贝的问题

你可能感兴趣的