苹果的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

dealloc.png
object_dispose.png
objc_destrucInstance.png
clearDeallocating.png









网友评论