【发布时间】:2012-04-03 22:34:54
【问题描述】:
我在配置为使用 ARC 的项目中遇到与 NSMutableArray 相关的内存泄漏,我认为它应该为您处理这些事情。
以下代码触发了 NSNumbers 的泄漏:
NSMutableArray *myArray = [[NSMutableArray alloc] init];
NSNumber *myNumber = [NSNumber numberWithFloat:10];
[myArray addObject:myNumber];
运行最后一行在调试器中给出以下内容:
objc[1106]:__NSCFNumber 类的对象 0x765ffe0 自动释放,没有适当的池 - 只是泄漏 - 在 objc_autoreleaseNoPool() 上中断以进行调试
除此之外,对象似乎已正确添加到可变数组中,
我做错了什么吗?
注意:项目中有一个类我无法使用 ARC,因此我使用编译器标志 -fno-objc-arc 将其从 ARC 中排除。但是,泄漏正在使用 ARC 的其他类中发生。不确定这是否相关。
非常感谢您的帮助。
【问题讨论】:
-
这段代码是否在单独的线程上运行?还是在
@autoreleasepool上下文之外的 main 方法中? -
项目中唯一提到@autoreleasepool的是main.m。故障代码在其他类中。如何检查该方法是否在单独的线程上?我没有故意把它放到一个单独的线程上,但有可能已经发生了。我使用我在网上找到的音频单元基于一些非官方的示例代码构建了这个项目,所以我不确定所有的元素。
-
嗨,Richard,泄漏发生在主线程的单独线程上,在渲染音频单元的同一线程上,这是从弧中排除的类。有没有办法可以将进程重定向到主线程?还是您认为我应该重新尝试让音频单元渲染与 ARC 一起使用?非常感谢您的帮助,我想您已经指出了可能的原因!
-
我想我可以采取的另一条路线是使用编译器标志从 arc 中排除麻烦的类,并以老式的方式做事。你有什么建议吗?我没有经验所以想尽可能使用 ARC...
-
只要在线程开始执行的时候添加一个@autoreleasepool,就可以了……
标签: ios xcode automatic-ref-counting