何时调用NSURLConnection委托释放?
将委托传递给NSUrlConnection
对象时,如下所示:
[[NSURLConnection alloc] initWithRequest:request delegate:handler];
什么时候你应该在委托上发布发布? 应该在connectionDidFinishLoading
? 如果是这样,我不断得到exec_bad_access
。 我看到我的代表正在通过仪器泄漏。
谢谢
从我的博客文章从这里: http : //i.ndigo.com.br/2012/01/releasing-nsurlconnection-and-its-delegate/
您将不得不多加注意委托对象,因为对于NSURLConnection
,委托有一个特殊的考虑:它始终保留。
initWithRequest:委托 :
特殊注意事项 :连接保留委托。 它在连接完成加载,失败或取消时释放委托。
所以,考虑到这一点,你有几个select,以确保您的代表将被正确释放,我会尽量解释2个简单的。
第一个也是最常用的,就是使用与NSURLConnection初始化相同的类作为委托。
[[NSURLConnection alloc] initWithRequest:request self];
通过这样做,您的类的保留计数将在连接开始时增加1,然后在连接完成加载,失败或取消之后减less1,导致没有内存泄漏。
第二个选项,即你正在尝试做的是使用另一个对象来处理所有的连接调用。 这工作得很好,但你需要额外的记忆。 你可以做一个简单的事情来解决你的问题是初始化与autorelease对象的连接。
//creates the handler object MyHandlerClass *handler = [[MyHandlerClass alloc] init]; //creates the connection with handler as an autorelease object [[NSURLConnection alloc] initWithRequest:request delegate:[handler autorelease]];
或者你可以在创build连接后立即释放你的处理程序(因为它已经被连接保留)
//creates the handler object MyHandlerClass *handler = [[MyHandlerClass alloc] init]; //creates the connection with handler [[NSURLConnection alloc] initWithRequest:request delegate:handler]; //releases handler object [handler release];
这两种方式都只会将处理程序对象的所有权仅留给连接类,这会在加载完成,失败或取消之后立即释放处理程序对象,从而再次导致内存泄漏。
编辑:通过做任何上面的选项,你不必担心在连接释放委托(但你仍然必须释放连接) connection:DidFinishLoading
和connection:didFailWithError
方法。
这将取决于对象handler
是什么以及如何使用它。 例如,我通常使用self
作为我的代理人:
[[NSURLConnection alloc] initWithRequest:request delegate:self];
我不需要调用发布self
因为代表不被保留, self
将被另一个对象释放。
如果handler
是一个新的对象,那么你将不得不释放它(和connectionDidFinishLoading:应该没问题,除非你需要使用handler
对象的其他东西)。
你是否熟悉Cocoa中的内存pipe理规则?
你能更好地了解对象handler
是什么以及如何使用它?
你需要释放连接,而不是委托。 NSURLConnection类我认为不保留委托,这就是为什么当你尝试释放它时会崩溃的原因。
两个释放连接的地方是连接:DidFinishLoading和连接:didFailWithError。
NSURLConnection
委托被保留。
在非ARC环境下使用ViewDidLoad
的代码。
NSLog(@"Retain count %d",[self retainCount]); NSURLConnection *con = [[NSURLConnection alloc] initWithRequest:nil delegate:self]; NSLog(@"Retain count %d",[self retainCount]);
对象处理程序用于实现connectionDidFinishLoading didReceiveData等。我做了很多的Web服务调用,而不是每个创build一个对象,我有一个中心类的所有东西:
@interface DataService : NSObject {} - (void) search:(NSString *) name byAddress:(NSString *)address; @end
所以该方法的实现创build委托传递:
SearchDelegate *delegate = [[SearchDelegate alloc] init]; [self sendRequestToUrl:urlString withJson:jsonString andHandler:delegate];
我在Instrument中看到的是SearchDelegate存在内存泄漏…所以我认为它实际上被保留了下来。
修改了一下我改变了我的sendRequestToUrlMethod有这个:
// http code setup blah... [[NSURLConnection alloc] initWithRequest:request delegate:handler]; [handler release];
而这似乎已经在仪器上报告了内存泄漏。