- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近在读 Advanced Memory Management当我偶然发现 Autorelease Pool Blocks 时的文档。文档指出:
You may use an autorelease pool block inside a loop to dispose of those objects before the next iteration. Using an autorelease pool block in the loop helps to reduce the maximum memory footprint of the application.[...] Any object sent an autorelease message inside the autorelease pool block is released at the end of the block.
在没有自动释放调用的 block 中创建的对象呢?我假设它们的保留计数也减少到 0。那么,我的问题是,无论哪种方式调用 autorelease 有什么意义, block 内创建的对象将在 block 结束时获得释放调用?
最佳答案
可以通过向对象发送 -release
或 -autorelease
消息来释放对象。
使用 -release
时,引用计数会立即减少,这可能会导致释放。
使用 -autorelease
递减被延迟以保持对象在其创建范围之外仍然有效。例如,辅助方法 -createFoo
可能会返回一个自动释放的对象,这样调用者就可以使用返回的对象,而无需在方法返回时立即释放该对象,也不必担心谁负责释放
使用 ARC,编译器会为您处理所有这些细节。您只需要知道,有时使用 autorelease
可以使对象存活的时间更长一些。
这种“保持事件状态”行为对如下循环有影响:
- (void)foobar
{
for (/* a long time */) {
NSMutableString *s = [NSMutableString string];
// ...
}
}
NSMutableString
上的+string
方法将返回一个自动释放的对象。这不会在循环迭代或方法结束时自动释放(好吧,ARC 可以通过查看调用堆栈来做一些巧妙的优化,但我们将忽略它)。这意味着当您在循环体内时,您将获得无限的内存增长。
请注意,如果我们使用了以下内容:
NSMutableString *s = [[NSMutableString alloc] init];
然后 ARC 会在循环体的末尾插入一个 release
调用,字符串会立即被释放。
为了解决第一个示例的无限制内存增长,您定义了一个显式的自动释放池:
- (void)foobar
{
for (/* a long time */) {
@autoreleasepool {
NSMutableString *s = [NSMutableString string];
// ...
}
}
}
现在,在循环的每次迭代之后,自动释放池被销毁,池中自动释放的任何对象(包括我们的字符串)将立即被释放。
所以这完全取决于您调用的方法种类以及它们是否返回自动释放的对象。
关于ios - 自动释放池 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16162878/
我有一个附加了 View Controller 的 AVAudioPlayer 实例。 @property (nonatomic, retain) AVAudioPlayer *previewAudi
我是java初学者。假设我声明了一个 Account 类型的变量 Account _account = new Account("Thomas"); 然后在其他地方我做了这样的事情: _account
我在我的应用程序中使用了 3 个 UIViewController,现在我想知道当我从另一个应用程序切换到另一个 UIViewController 时释放它们是否是一个好主意。显然,这将是隐藏的,当它
我分配了一个直接缓冲区: ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024); 我读过: Deallocating Direct Buf
场景。我有一个图表,我可以使用右键单击来执行平移。这非常有效。然后我完美地添加了右键菜单。 问题。现在,即使在拖动操作完成后释放鼠标,也会显示右键菜单。 有没有办法在 Java Swing 或 Jav
我使用此代码获取 ABPerson 的姓氏 CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABP
目前,我们在基于 C 的嵌入式应用程序中使用 malloc/free Linux 命令进行内存分配/取消分配。我听说这会导致内存碎片,因为内存分配/取消分配会导致堆大小增加/减少,从而导致性能下降。其
当我尝试释放缓冲区时遇到问题。每次我尝试将缓冲区传递给释放方法时,都会发生段错误。 Valgrind 确认段错误位于 BufferDeallocate 方法中。 ==30960== Memcheck,
我想知道何时按下或释放修改后的键(Ctrl 或 Shift)。 基本上,用户可以在按下修改键的情况下执行多次击键,而我不想在它被释放之前执行一个操作(想想 Emacs 和 Ctrl + X + S).
我编写了一个相当大的网络应用程序。它运行良好一段时间,然后慢慢开始运行缓慢,因为 DOM 节点开始爬升到 80,000 - 100,000 左右。 所以我一直在 Chrome 开发工具控制台 (DCT
我知道在像 c 这样的语言中,我需要在分配内存后释放它。 (我来自 Java),对此我有几个问题: 当我在做的时候: int array[30]; (即创建一个大小为 30 个整数的数组)与
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to release pointer from boost::shared_ptr? Detach
我有一个可以从多个后台线程访问的类,可能同时访问。我无法复制该类,因为重新创建它的内容(处理或内存方面)可能很昂贵。 也有可能在后台处理仍在继续并访问该属性时替换了此类的属性。 目前我有定期的保留/释
这个问题是对: 的扩展链接-1:Creating an image out of the ios surface and saving it Link-2:Taking Screenshots fro
我有一个实例变量 NSMutableArray* searchResults。 首先,我初始化它: self.searchResults = [[NSMutableArray alloc] init]
如果我在堆上声明一些东西,比如 char *a=new char[1000] 并且主程序停止,如果没有 delete[]<,那么分配的内存会发生什么 调用?它保留在堆上还是自动释放? 最佳答案 就C+
在开发相机应用时,我遇到了一个异常,该异常仅在我切换到其他应用时发生(onPause() 用于我的应用)。 01-15 17:22:15.017: E/AndroidRuntime(14336): F
使用 JDK 1.8 编译时出现 maven 编译器错误 无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (de
将 BufferedImage 保存到磁盘(以释放内存)的最快方法是什么? 我的 Java 应用程序处理大量图像(每约 300 毫秒将图像加载到内存中)。大多数这些图像都会立即被丢弃 (gc),但每隔
使用 JDK 1.8 编译时出现 maven 编译器错误 未能在项目 DUMMY 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:
我是一名优秀的程序员,十分优秀!