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星
用户评分:
发表评论

评论

  • 暂无评论信息