内存泄漏使用(void)alloc

时间:2010-03-23 03:30:11

标签: iphone memory-leaks

我在Apples代码中看到了类似的代码行:

(void)[[URLRequest alloc] initializeRequestWithValues:postBody url:verifySession httpHeader:nil delegate:self];

URLRequest是我自己的自定义类。我没有写这个,我认为这个人只是从Apple的例子中抓住了它。对我来说,这应该泄漏,当我测试它时,我很确定它泄漏了16个字节。是吗?我知道如果它确实如何解决,但不确定它是从Apple的代码中获取的。

编辑:问题出在SDK上,而不是上面的代码。请参阅下面的答案以获取更多详细信息

3 个答案:

答案 0 :(得分:3)

以为我可能会在进一步测试和iOS4发布后更新它。

上述代码不会泄漏,即使在200次代码迭代后,App的内存占用也恢复正常。泄漏确实发生在iOS3中但非常小,在iOS4中它在模拟器和设备中完全消失。

有些人可能想知道你为什么要实现这个代码,但是当你在同时运行的代码中处理大量不同的NSURLConnections时,它可以正常工作。

答案 1 :(得分:2)

完全不确定这段代码应该完成什么。它确实打破了关于初始化方法的每一个约定。从初始化方法返回void指针有什么意义?初始化方法的全部要点是返回一个对象。在Apple的代码示例中你看到了什么?

话虽如此,我不明白为什么会泄漏。由于它不返回对象,因此没有任何东西可以在方法外部泄漏。内部可能存在泄漏的内容。

修改

  

它基本上是一个NSURLConnection。   因为我们提交了很多   形式有很多不同的价值观   我们把它放在外部课堂上。所有   委托方法如   didFailWithError:在NSURLRequest中   和connectionDidFinishLoading   将数据传递给其委托。所以   真的不需要退货   因为它是通过代表完成的   方法

是的,你需要重新设计它。目前,这种方法只是一场等待发生的灾难。如果不出意外,其他所有看过这段代码的人都会对你正在做的事情感到困惑。

如果您不需要保留创建的对象,则移动其分配并在方法内完全清理。将方法名称前缀从“初始化”更改为“setup”,“configure”,“acquire”等,因此名称并不意味着它创建并返回和对象。

如果你需要一个特定类的一次性实例,可以使用像Michael Aaron Safyan建议的类方法(同样没有在名称中初始化。)类方法应该在内部初始化一个实例,执行所需的操作,返回数据到哪里,然后dealloc实例。

这样,您就不必担心泄漏,而其他可能阅读您的代码的人(包括您自己几个月后)会立即了解代码的作用。

答案 2 :(得分:2)

是。这是一个泄漏,可以通过添加自动释放来轻松修复:

[[[URLRequest alloc] initializeRequestWithValues:postBody url:verifySession httpHeader:nil delegate:self] autorelease];

也许更好的解决方法是创建一个执行此操作的类函数:

@interface URLRequest
{
   // ...
}
// ...
+ (void) requestWithValues:/* ... */ 
// ...
@end

然后你可以简单地使用[URLRequest requestWithValues:/ * ... * /]而无需调用alloc。