这两种写法的区别

cnaaa8 2015-09-08 04:53:13
[self.app release]和 self.app=nil
...全文
184 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dz215136304 2016-03-23
  • 打赏
  • 举报
回复
前面是release对象,后面是将其指向了nil,不影响原先的对象
0x8023 2015-09-10
  • 打赏
  • 举报
回复

-(void) dealloc
{
   NSDeallocateObject(self);
}

inline void
NSDeallocateObject (id anObject)
{
   struct obj_layout *o = &((struct obj_layout *) anObject) [-1];
   free(o);
}
你这是想写dealloc吧, [_app release]; _app = nil; //和下面效果一样

self.app = nil;
  • 打赏
  • 举报
回复
引用 4 楼 LWHONG101 的回复:
引用 3 楼 onunix 的回复:
[quote=引用 2 楼 qq_31154757 的回复:] 两者都可以释放当前对象,后者还能清空指针,防止出现野指针
这不对吧,不一定会释放对象,如果只有它指向这个对象,才会释放,并且也不是立即释放,因此,区别还蛮大的
release 只是单纯的对计数减1,比如[p release] 如果用[p retaincount]出来的结果是3(假如有三个对象在用它),那么[p release]后只是count的计数减1,如果[p retaincount]的结果是1那么[p release]后计数减为0 ,减为0后就回去执行dealloc 方法,因此release并没有释放对象的作用,仅仅只是计数减1;而nil则是将指针p赋值为空,不指向任何对象,空对象不管是做release还是其他操作编译器是不会报错的;它们两者的关系是如果先前有一个指针p 指向一个person对象 那么如果此时做p = nil ,在mrc中那么在手动写的set方法那里会有一个release,做release计数减1,如果计数减为了0那么这个对象会被释放掉,如果这个对象的计数不为0那么就不会被释放,如果是在arc,因为arc那里有retain或者是strong修饰所以的那个set方法中已经写好了,但是在set方法里面还是做同样的操作即做一次release,做完release后如果计数减为0,那么这个对象就会被释放,如果计数不为0那么对象是不会被释放的。明白了吗?[/quote]说的对,重点就是self.app=nil;会执行set方法,而且set方法里已经包含了[self.app release];
秋风不下烈雨 2015-09-09
  • 打赏
  • 举报
回复
引用 3 楼 onunix 的回复:
引用 2 楼 qq_31154757 的回复:
两者都可以释放当前对象,后者还能清空指针,防止出现野指针
这不对吧,不一定会释放对象,如果只有它指向这个对象,才会释放,并且也不是立即释放,因此,区别还蛮大的
release 只是单纯的对计数减1,比如[p release] 如果用[p retaincount]出来的结果是3(假如有三个对象在用它),那么[p release]后只是count的计数减1,如果[p retaincount]的结果是1那么[p release]后计数减为0 ,减为0后就回去执行dealloc 方法,因此release并没有释放对象的作用,仅仅只是计数减1;而nil则是将指针p赋值为空,不指向任何对象,空对象不管是做release还是其他操作编译器是不会报错的;它们两者的关系是如果先前有一个指针p 指向一个person对象 那么如果此时做p = nil ,在mrc中那么在手动写的set方法那里会有一个release,做release计数减1,如果计数减为了0那么这个对象会被释放掉,如果这个对象的计数不为0那么就不会被释放,如果是在arc,因为arc那里有retain或者是strong修饰所以的那个set方法中已经写好了,但是在set方法里面还是做同样的操作即做一次release,做完release后如果计数减为0,那么这个对象就会被释放,如果计数不为0那么对象是不会被释放的。明白了吗?
onunix 2015-09-09
  • 打赏
  • 举报
回复
引用 2 楼 qq_31154757 的回复:
两者都可以释放当前对象,后者还能清空指针,防止出现野指针
这不对吧,不一定会释放对象,如果只有它指向这个对象,才会释放,并且也不是立即释放,因此,区别还蛮大的
qq_31154757 2015-09-08
  • 打赏
  • 举报
回复
两者都可以释放当前对象,后者还能清空指针,防止出现野指针
儿大不由爷 2015-09-08
  • 打赏
  • 举报
回复
前面是release对象,后面是将其指向了nil,不影响原先的对象

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧