iOSInterviewQuestions icon indicating copy to clipboard operation
iOSInterviewQuestions copied to clipboard

32. objc使用什么机制管理对象内存?

Open ahahe opened this issue 8 years ago • 1 comments

  1. objc使用什么机制管理对象内存? 1、通过 retainCount 的机制来决定对象是否需要释放。 2、每次 runloop 的时候,都会检查对象的 retainCount,如果retainCount 为 0,说明该对象没有地方需要继续使用了,可以释放掉了。

第2句应该这么说: 其实是每次release时候检查retainCount减一,当为0时候释放对象。 然后再说release对象的各种情况: 一、对象成员变量 1、这个对象dealloc时候,成员变量objc_storeStrong(&ivar,nil) release

二、局部变量变量的释放 分情况: 1、strong obj变量,出了作用域{},就objc_storeStrong(obj,nil) release对象; void objc_storeStrong(id *location, id obj) {

id prev = *location;
if (obj == prev) {
    return;
}
objc_retain(obj);
*location = obj;
objc_release(prev);

}

2、weak obj变量,出了作用域,objc_destroyWeak 将变量(obj)的地址从weak表中删除。;

3、autorelease obj变量,交给autoreleasepool对象管理, (1)主动使用@autoreleasepool{},出了{} 对象release (2)不使用@autoreleasepool{},交给线程管理 ①线程开启runloop,在每次kCFRunLoopBeforeWaiting休眠时候,执行PoolPop(release对象)再PoolPush, ②线程没有开启runloop,在线程介绍时候执行PoolPop(release对象)

ahahe avatar Oct 18 '17 13:10 ahahe

正解,retainCount 不可能依赖 runloop 检查,两码事,runloop 只是自动管理了一个 autoreleasepool,autoreleasepool pop 时可能会导致 retainCount 为 0 从而导致对象释放

hssdx avatar Apr 07 '18 08:04 hssdx