IOS main 函数中为何要包着 @autoreleasepool ?Objective-C中的类和对象在内存中是咋运行的
时间:2018-01-01 15:48:02
浏览:次
点击:次
作者:
来源:
立即下载
包着有什么作用? 不包会出什么问题?
我只想说 给RunLoop加上①个池的答案其实并不是很正确。
在CFRunLoopRun核心实现__CFRunLoopRun的反汇编中可以看出,rl本身就自己压了①个池,如果说只是为rl需要外界提供①个池,那显然不对,rl本身首先无法知道外界是否已经提供希望rl使用的池,而且在使用池的过程中只能使用池链的顶端的那①个,如果rl进入没有池其实也没关系,在objc_autorelease的实现里会有快速和慢速两个,快速就是根据“标兵”决定是否需要入池,慢速就是没有池可以用,需要创建①个新池,跟外部给不给无所谓。但是,重要的是在main那个池块的pop点,如果main不像这么“简单”的话,多出来的autoreleased objects将在运行的时候没有合适的释放点直到运行结束,这才是这个main的池块的关键所在。这个池块给出了①个pop点来显式的告诉我们这里有①个释放点,如果你的main在初始化的过程中有别的内容可以放在这里,当然最好是别的地方,比如 @autoreleasepool { xxx; /* do somethings*/ } @autoreleasepool { return UIApplicationMain(...); }
还有①点不知道有没有注意,可以让可以被释放的对象在return时释放掉,排除干扰,用于检查资源泄漏相关的问题。
平均评分
0人
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息