ChenYilong / iOSInterviewQuestions

iOS interview questions;iOS面试题集锦(附答案)--学习qq群或 Telegram 群交流 https://github.com/ChenYilong/iOSBlog/issues/21

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

ahahe opened this issue · 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对象)

commented

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