Jer*_*y L 2 cocoa memory-management objective-c dealloc
似乎在Objective-C中,负责内存分配的方法(如malloc()在C中),是-[NSObject alloc].那释放那些记忆怎么样?这样做了-[NSObject dealloc]吗?这就是为什么在我们自己的班级里dealloc,我们必须打电话给[super dealloc]最后一个而不是第一个?
我问,因为我不明白为什么,如果我[super dealloc]先放,并[_bar release]在下一行使用释放对象,我不会得到分段错误.之后[super dealloc]运行,如果它释放对象的内存,_bar应该已经不属于该进程的内存块.
我想你是说,你有这个代码:
- (void)dealloc
{
[super dealloc];
[_bar release]; // _bar is a member variable
}
Run Code Online (Sandbox Code Playgroud)
并且你希望在第二行得到分段错误,但实际上你不是.
原因就是运气!
操作系统会捕获对您的进程不拥有的内存的访问权限,但它不会监控进程内发生的所有事情.在这种情况下,您正在访问已标记为可用的内存,但它仍属于您的进程,因此行为未定义.内存在几毫秒之前就有效了,所以很可能没有人开始重用这个内存页面,因此它可能仍然有有效的数据.所以它可能会成功.但它也可能失败.
这是错误的代码,你不应该发货.但仅仅因为它不正确并且未定义并不意味着它不起作用.
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |