内存OC 底层iOS 进阶

内存管理 - 引用计数 weak指针

2018-09-18  本文已影响31人  曹来东

引用计数的存储

uintptr_t
_objc_rootRetainCount(id obj)
{
    assert(obj);

    return obj->rootRetainCount();
}

inline uintptr_t 
objc_object::rootRetainCount()
{
    //是一个TaggedPointer 不是一个OC对象
    if (isTaggedPointer()) return (uintptr_t)this;

    sidetable_lock();
    isa_t bits = LoadExclusive(&isa.bits);
    ClearExclusive(&isa.bits);
    if (bits.nonpointer) {//优化过的isa指针,引用计数这样获取
        uintptr_t rc = 1 + bits.extra_rc;//19位够存储,直接取出引用计数 + 1
        if (bits.has_sidetable_rc) {//如果19位不够存储,has_sidetable_rc值为1
            rc += sidetable_getExtraRC_nolock();//从sidetable中获取额外的引用计数累加
        }
        sidetable_unlock();
        return rc;//返回该对象的引用计数.
    }

    sidetable_unlock();
//没有优化过的isa指针,直接从sidetable中获取引用计数
    return sidetable_retainCount();
}

dealloc weak指针实现原理

ARC工作内容:

自动释放池

AutoreleasePoolPage的结构

Runloop和Autorelease

autorelease对象在什么时机会被调用release

当前所处的RunLoop休眠之前,或退出前会调用pop操作,来释放autorelease对象.

方法里有局部对象, 出了方法后会立即释放吗

如果编译器对该局部对象生成的内存管理代码是autoreleasepool该对象不会立刻释放,需要在RunLoop休眠之前,或退出前会调用pop操作,来释放autorelease对象;如果编译器对该局部对象生成的内存管理代码是在方法结束插入relase代码,则该对象出了方法会立即释放.

上一篇下一篇

猜你喜欢

热点阅读