将来跳槽用

iOS内存的代码实现

2019-05-28  本文已影响26人  二斤寂寞

苹果的runtime源码可以在这里看runtime,如果你觉得这样看不方便的话,你可以通过wget把源码现在下来看,具体命令如下所示

wget -c -r -np -k -L -p https://opensource.apple.com/source/objc4/objc4-723/

下面我看看苹果的源码是如何实现。 https://opensource.apple.com/source/objc4/objc4-723/runtime/NSObject.mm.auto.html

底层更多实现查看

alloc

alloc.png

retain

retain.png

release

release.png

retainCount

retainCount.png

autorelease

调用autorelease方法的内部实现

- (id) autorelease {
    [NSAutoreleasePool addObject: self];
}

autorelease实例方法的本质就是调用NSAutoreleasePool对象的addObject类方法。

autorelease作用是将对象放入自动释放池中,当自从释放池销毁时对自动释放池中的对象都进行一次release操作。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id obj = [[NSObject alloc] init];
[obj autorelease];
[pool drain]; 

ARC下,使用@autoreleasepool{}来使用一个AutoreleasePool,随后编译器会改成下面的样子:

void *context = objc_autoreleasePoolPush();
// 执行的代码
objc_autoreleasePoolPop(context);

而这两个函数都是对AutoreleasePoolPage的简单的封装,所以自动释放机制的核心就在于这个类。
AutoreleasePoolPage是一个C++实现的类
详细讲解查看autoreleasepool

dealloc

dealloc01.png
dealloc.png

object_dispose:


object_dispose.png

objc_destrucInstance:


objc_destrucInstance.png
clearDeallocating:(这就是为什么weak指针置为nil,对象会销毁的内部实现)
clearDeallocating.png
上一篇 下一篇

猜你喜欢

热点阅读