作者uranusjr (←这人是超级笨蛋)
看板MacDev
标题Re: [问题] 简单的程式就有 memory leak 了
时间Wed Apr 16 13:53:41 2014
※ 引述《darktt (小朱)》之铭言:
1F:→ Blueshiva:RefCount降到0也不会马上删除,必须等autorelease pool 04/16 11:42
2F:→ Blueshiva:要删除的时候才会一起检查,一起删除 04/16 11:42
实际上 Foundation 里面怎麽做我是不知道啦, 但这是 Cocotron 的源码
http://d.pr/B3bo
-(oneway void)release {
if(NSDecrementExtraRefCountWasZero(self))
[self dealloc];
}
这是苹果开源的 Objective-C Runtime 源码
http://www.opensource.apple.com/source/objc4/objc4-532/runtime/NSObject.mm
- (oneway void)release
__attribute__((aligned(16)))
{
// tagged pointer check is inside _objc_rootReleaseWasZero().
if (_objc_rootReleaseWasZero(self) == false) {
return;
}
[self dealloc];
}
如果 release 之後 ref count 是 0 就会直接呼叫 dealloc 进入自爆程序了
没记错的话, 苹果的文件也是说 ref count 一旦降到 0 就会立刻毁灭
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.94.57
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/MacDev/M.1397627628.A.E0C.html
※ 编辑: uranusjr (140.112.94.57), 04/16/2014 13:56:54
3F:→ atst2:这是要看最後call的是release还是autorelease吧? 04/16 14:05
4F:→ atst2:如果全部都call release是直接毁掉没错,但如果中间有call 04/16 14:06
5F:→ atst2:autorelease,那应该会push到autorelease pool 04/16 14:07
6F:→ atst2:有开arc的话,好像没办法自己决定用release还是autorelease 04/16 14:10
7F:→ atst2:真的很要求记忆体的话, 恐怕还是得关掉arc,全部自己来处理. 04/16 14:11