- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是我的测试代码:
for (int i = 0; i < 1000000000; ++i) {
NSString *string = @"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
}
在ARC环境中,循环不会使内存爆炸。在我的例子中,运行这个循环只需要1.2MB RAM。
但是在MRC中,除非使用@autoreleasepool代码块,否则循环会使内存爆炸。令我困惑的是有很多文章说当代码在for中时需要将代码放在@autoreleasepool中环形。但在这种情况下,没有@autoreleasepool 也没关系。请帮我解决这个问题。谢谢。
更新:如果我这样写代码:
for (int i = 0; i < 1000000000; ++i) {
NSString *string = [NSString stringWithFormat:@"aaaaaaaaaaaaaaaaaaa"];
}
这段代码会导致 ARC 和 MRC 中的内存爆炸。为什么?
stringWithFormat:
还返回一个自动释放对象。我对此感到困惑...
最佳答案
使用 ARC 编译的代码必须与未使用 ARC 编译的代码进行互操作。此外,您不能假设 Foundation,尤其是您正在调用的 NSString
的方法,是用 ARC 编译的。
那些 NSString
方法必须以这样的方式编译,以便它们可以从 ARC 和非 ARC 代码中调用。这意味着他们必须自动释放他们返回的对象,无论他们自己是否使用 ARC 编译。
但是,如果那些 NSString
方法是用 ARC 编译的,那么它们可能会使用 objc_autoreleaseReturnValue()
来执行自动释放。如果调用者也是用 ARC 编译的并且它保留了对象(因为,例如,它被分配给了一个强局部变量),那么它可能会对其使用 objc_retainAutoreleasedReturnValue()
。在那种情况下,可以避免使用自动释放池。 objc_autoreleaseReturnValue()
通过检查堆栈和调用者的指令,可以检测到调用者将对返回值使用 objc_retainAutoreleasedReturnValue()
,它不会自动释放该值,并且它将通过侧 channel 将这一事实传达给 objc_retainAutoreleasedReturnValue()
,这样它就不会保留该值。
因此,在某些您不能依靠自己决定的特定情况下,“通常”会自动释放然后保留对象的代码不会。它只会转移所有权。
ARC 不会自动耗尽自动释放池或引入内部自动释放池。
由于不确定性,您应该始终使用 @autoreleasepool
围绕任何可能由于自动释放对象而导致内存激增的代码。例如:
for (int i = 0; i < 1000000000; ++i) @autoreleasepool {
NSString *string = @"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
}
关于ios - 为什么在没有 @autoreleasepool 的 for 循环的每个循环中 NSString autorelease,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33642853/
在循环操作中将大量autoreleased 对象放入autoreleasepool 是一个很好的做法。我发现有人将@autoreleasepool 放入循环中,但其他人将循环放入@autoreleas
在 ios 中,一个主要的自动释放池围绕着 UIApplicationMain。如果我没有在应用程序内手动设置其他自动释放池,这是否意味着每当我在应用程序中使用自动释放释放对象时,它实际上不会被释放,
我目前正在构建一个通过 API 请求提取大型 JSON 文件的应用。 在下载-解码-存储数据的过程中,我收到了内存警告(超过 500MB)。我找到了一个解决方案来避免内存过载,并通过添加 @autor
我正在使用 ARC,我知道自动释放池会向其中的所有元素发送释放。考虑以下示例。 -(NSString*)someMethod{ NSString *string1=@"sample text
我在大型应用程序中遇到内存问题。我已将其简化为以下代码。如果我让应用程序运行到完成,内存就会耗尽,因此我没有真正的内存泄漏。 但是,在它运行时,每次调用 customLog: 都会累积内存并且内存不会
我在我的代码中混合了一些 ObjectiveC 和 C++。 (我的文件是 .mm 文件,而不是 .m。)什么时候才是用 @autoreleasepool 包装任何代码块的正确理由?不知道我在做什么,
我不能在 main() 中有一个“大的”NSAutoreleasePool——我不允许碰它。那么每个对象有一个池呢? struct MacGuiEngine { // members … Sc
这个问题在这里已经有了答案: How does the NSAutoreleasePool autorelease pool work? (7 个答案) 关闭 6 年前。 我看了很多关于@autor
我有一个头文件(类似 C) 我必须创建一个 Obj-c 库(或者只是几个 .m -s)来实现它。 调用该库的人将是一个 C 程序。 但是我不想手动处理内存分配,我想使用 ARC。 我可以在我的函数中使
我的问题中的术语可能错误,但这是我最好的尝试: 我的 iOS 应用程序的 ARC 启用了 autoreleasepool。因此,我不会根据自己的选择释放内存,但它似乎是在 GC 拾取器上。 我无法让
我尝试在 dispatch_async block 中使用 autoreleasepool,但它不会释放 str。当重复调用 timerEvent 时,会导致内存不足问题。 - (void)viewD
Advanced Memory Management Programming Guide关于@autoreleasepool 说: 使用本地自动释放池 block 减少峰值内存占用量 Many pro
看了GCD的文章,有个例子: dispatch_queue_t bgQueue = myQueue; dispatch_async(dispatch_get_main_queue(), ^{
在ARC下,我们不能再调用autorelease了。本质上,自动释放池的整个概念已经过时了。那么,为什么我们需要 @autoreleasepool 指令? 最佳答案 事实上,在使用 ARC 时,保留/
我正在阅读 llvm 站点上的 ARC 文档:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool ..
我有一个正在重构的应用程序,我刚刚实现了多线程,以便 UI 可以运行得更流畅。在 iPhone 模拟器中,我没有遇到任何泄漏,但在运行 iOS 4.2 的 iPhone 3G 上进行测试时,出现了内存
考虑这个例子: - (void)doSomething { @autoreleasepool { if (someCondition) { /* ... alloc
我正在开发一个 NSData 扩展,它使用 key 加密数据,如下所示。我对 Objective-C 不太了解,但想将它用于这个 Cordova 插件,而不是需要另一个插件来桥接 Swift 文件。
如果我将 UIApplicationMain 包装在 @autoreleasepool 中,是否意味着我永远不必考虑 Objective C 中的内存管理? 例如: @autoreleasepool
所以应用程序崩溃了,没有堆栈跟踪或任何异常,我每次都可以复制这个崩溃。我的第一个想法是它必须是双版本,在运行 zombies 10 分钟后,我无法让应用程序崩溃,一次都没有。 在查看 Allocati
我是一名优秀的程序员,十分优秀!