我有一个奇怪的(在我看来)和使用 ARC(自动引用计数)的简单内存泄漏情况。我正在使用 iOS 代码,但我认为它应该普遍适用于 Objective-C。
我有一个以下函数,它在检查参数对象的属性后返回作为参数分配的对象。
- (id) returnParam:(id) obj
{
// Do whatever filtering needed. Return nil for invalid input.
return (NSNumber *)obj;
}
如果我在循环中调用此方法,如下所示,我可以看到分配的内存不断增加,直到循环在 Instruments 中结束。
for(int i = 0; i < 1000000; i++)
{
id obj = [[NSNumber alloc] initWithInt:i];
id obj2 = [self returnParam:obj];
NSLog(@"attempt %@", obj2);
}
但是,如果我将returnParam
函数的内容按如下方式放入循环中,则一切正常。内存脚印一直保持相同的大小。
for(int i = 0; i < 1000000; i++)
{
id obj = [[NSNumber alloc] initWithInt:i];
// Do whatever filtering needed. Break on invalid input.
id obj2 = obj;
NSLog(@"attempt %@", obj2);
}
我已经消除了过滤部分(所以基本上该函数只将对象传递回调用者),同样的情况仍然存在。
不明白为什么这个序列不会像假设的那样减少保留计数,我尝试了所有可能的组合__weak
,__unsafe_unretained
这里和那里,但没有一个有效。
有人可以解释为什么这个(返回参数对象)不起作用,并建议我解决这个问题吗?
PS BTW,它没有被捕获为仪器中的内存泄漏事件,但我认为的情况是明显的内存泄漏。