【发布时间】:2013-08-12 18:30:39
【问题描述】:
Advanced Memory Management Programming Guide 说关于@autoreleasepool:
使用本地自动释放池块来减少峰值内存占用
许多程序会创建自动释放的临时对象。这些 对象添加到程序的内存占用,直到结束 堵塞。在许多情况下,允许临时对象堆积 直到当前事件循环迭代结束不会导致 过多的开销;但是,在某些情况下,您可以创建一个 大量增加内存的临时对象 足迹,并且您希望更快地处理。在这些 后一种情况,您可以创建自己的自动释放池块。在 在块的末尾,临时对象被释放,这通常 导致它们被释放,从而减少程序的内存 足迹。
以下示例显示了如何使用本地自动释放池 在 for 循环中阻塞。
NSArray *urls = <# An array of file URLs #>;
for (NSURL *url in urls) {
@autoreleasepool {
NSError *error;
NSString *fileContents = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding error:&error];
/* Process the string, creating and autoreleasing more objects. */
}
}
这段代码是否也可以在没有自动释放池的情况下编写并有效管理?
就像创建一个property of fileContents 并在处理后设置它nil。
self.filecontents = nil;
【问题讨论】:
-
这段代码可以在没有 ARP 的情况下编写,因为 ARC 现在在 iOS 中存在。
-
@Ashwin:据我了解,自动释放池独立于手动和自动引用计数。即使使用 MRP,也可以在没有 ARP 的情况下编写代码(只需在下面我建议的答案中将
fileContents = nil替换为[fileContents release])。 -
@Ashwin 这完全是错误的。 ARC 引入了
autorelease块格式。除非使用autoreleasepool,否则循环内的自动释放对象将在运行循环到达下一次迭代之前不会被释放(因为UIKit在autoreleasepool块中运行每个事件)。 -
谢谢! @danielbeard 进行解释,让我更好地理解。
标签: ios objective-c nsautoreleasepool