何时调用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 ,委托有一个特殊的考虑:它始终保留。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697-BAJDDIDG

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:DidFinishLoadingconnection: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]; 

而这似乎已经在仪器上报告了内存泄漏。