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
方法中会进行进一步的判断,判断是否需要重新开辟内存以及深拷贝,浅拷贝的问题
网友评论