我在Apples代码中看到了类似的代码行:
(void)[[URLRequest alloc] initializeRequestWithValues:postBody url:verifySession httpHeader:nil delegate:self];
URLRequest是我自己的自定义类。我没有写这个,我认为这个人只是从Apple的例子中抓住了它。对我来说,这应该泄漏,当我测试它时,我很确定它泄漏了16个字节。是吗?我知道如果它确实如何解决,但不确定它是从Apple的代码中获取的。
编辑:问题出在SDK上,而不是上面的代码。请参阅下面的答案以获取更多详细信息
答案 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。