IOS main 函数中为何要包着 @autoreleasepool ?Objective-C中的类和对象在内存中是咋运行的

发表时间:2018-01-01 15:48:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《opencv+cuda+gpu为何如此的慢?为什么样我的用opencv的gpu模块做个简单的算法都比cpu慢(还没有计算数据交换时间》相关知识。本篇中小编将再为您讲解标题IOS main 函数中为何要包着 @autoreleasepool ?Objective-C中的类和对象在内存中是咋运行的。

包着有什么作用? 不包会出什么问题?

我只想说 给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时释放掉,排除干扰,用于检查资源泄漏相关的问题。

编后语:关于《IOS main 函数中为何要包着 @autoreleasepool ?Objective-C中的类和对象在内存中是咋运行的》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《为何广播电台要在周二停机检修呢?谁知道哪里能弄到黑莓8700g的主板(能正常使用的)》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题