Re: [问题] 简单的程式就有 memory leak 了

楼主: uranusjr (←這人是超級笨蛋)   2014-04-16 13:53:41
※ 引述《darktt (小朱)》之铭言:
→ Blueshiva:RefCount降到0也不会马上删除,必须等autorelease pool 04/16 11:42
→ 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 就会立刻毁灭
作者: Blueshiva (龙野南云)   2014-04-16 11:42:00
RefCount降到0也不会马上删除,必须等autorelease pool要删除的时候才会一起检查,一起删除
作者: atst2 (atst2)   2014-04-16 14:05:00
这是要看最后call的是release还是autorelease吧?如果全部都call release是直接毁掉没错,但如果中间有callautorelease,那应该会push到autorelease pool有开arc的话,好像没办法自己决定用release还是autorelease真的很要求内存的话, 恐怕还是得关掉arc,全部自己来处理.

Links booklink

Contact Us: admin [ a t ] ucptt.com