内存管理 – 是否有必要在Swift程序中使用autoreleasepool?
在
this WWDC14 presentation的第17页,它说
这意味着什么?这是否意味着如果我的代码库没有任何Objective-C文件,autoreleasepool {}是不必要的? 在an answer of a related question,有一个例子,autoreleasepool可以是有用的: - (void)useALoadOfNumbers { for (int j = 0; j < 10000; ++j) { @autoreleasepool { for (int i = 0; i < 10000; ++i) { NSNumber *number = [NSNumber numberWithInt:(i+j)]; NSLog(@"number = %p",number); } } } } 如果上面的代码被转换为Swift与autoreleasepool删除,Swift会聪明到足以知道数字变量应该在第一个之后释放(像其他语言一样)?
当返回自动释放对象(由你的Objective-C代码或使用Cocoa类创建)时,在Swift中使用autoreleasepool模式。 Swift中的自动释放模式与Objective-C中的一样。例如,考虑你的方法的Swift再现(实例化NSImage / UIImage对象):
func useManyImages() { let filename = pathForResourceInBundle for _ in 0 ..< 5 { autoreleasepool { for _ in 0 ..< 1000 { let image = NSImage(contentsOfFile: filename) } } } } 如果在Instruments中运行,您将看到如下所示的分配图: 但是如果你没有自动释放池,你会看到峰值内存使用率更高: autoreleasepool允许你显式管理当自动释放对象在Swift中释放,就像你在Objective-C中。 注意:当处理Swift本机对象时,通常不会接收自动释放对象。这就是为什么演示文稿提到了当“使用Objective-C”时只需要这个提示,虽然我希望苹果在这一点上更清楚。但是如果你处理Objective-C对象(包括Cocoa类),它们可能是自动释放对象,在这种情况下,Objective-C @autoreleasepool模式的Swift再现仍然有用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 将const指针定义为const字符串
- apt-get install安装软件问题(安装包的依赖库版本过高问题)
- iphone – Interface Builder不会看到动作方法
- ruby-on-rails – 使用Rails和Paperclip导入旧数据
- c# – 从异步编程模型(APM)迁移到基于任务的异步模式(TAP)
- swift – 在iOS 8共享扩展程序和主应用程序之间共享数据
- c# – 获取所有DropDown列表的选定选项
- 正则表达式 – [A-Z]是什么意思[A-Za-z]?
- C#版Windows服务安装卸载小工具
- c# – 使用SignalR Core将控制器方法的消息发送到Angular