Objective c NSURLRequest自动释放:崩溃

Objective c NSURLRequest自动释放:崩溃,objective-c,cocoa,Objective C,Cocoa,我在释放NSMutableURLRequest对象时遇到问题。 取消分配请求对象期间应用程序崩溃 该对象是通过[[NSMutableURLRequest alloc]initWithURL:my_http_url]创建的 作为主流控制流,我尝试释放connection对象以响应调用的ConnectionIDFinishLoading处理程序 首先,我尝试在ConnectiondFinishLoading处理程序中自动释放NSMutableURLRequest。这导致崩溃,所以我认为这可能是因为c

我在释放NSMutableURLRequest对象时遇到问题。 取消分配请求对象期间应用程序崩溃

该对象是通过[[NSMutableURLRequest alloc]initWithURL:my_http_url]创建的

作为主流控制流,我尝试释放connection对象以响应调用的ConnectionIDFinishLoading处理程序

首先,我尝试在ConnectiondFinishLoading处理程序中自动释放NSMutableURLRequest。这导致崩溃,所以我认为这可能是因为connection类在调用ConnectionIDFinishLoading之前在内部推送autorelease池,并且在处理程序返回时仍然希望连接对象有效,因此不可能在ConnectionIDFinishLoading中释放或自动释放连接对象

如果我根本不释放NSMutableURLRequest,根据引用计数1泄漏的仪器

因此,我决定通过触发一个nsrunlop事件来执行延迟发布,该事件自动删除传递给它的NSMutableURLRequest。 这仍然会导致崩溃

调用自动释放之前的重新计数为1

崩溃堆栈是:

0   0x9448aedb in objc_msgSend
#1  0x04a47ce0 in ??
#2  0x02e51501 in HTTPMessage::~HTTPMessage
#3  0x02945621 in _CFRelease
#4  0x02e516a9 in HTTPRequest::~HTTPRequest
#5  0x02e50967 in URLRequest::~URLRequest
#6  0x02945621 in _CFRelease
#7  0x0032fb70 in -[NSURLRequestInternal dealloc]
#8  0x0032fb1a in -[NSURLRequest dealloc]
#9  0x002f27a5 in NSPopAutoreleasePool
#10 0x003b5dd0 in __NSFirePerformTimer
#11 0x0299e8a2 in __CFRunLoopDoObservers
#12 0x0296a39e in CFRunLoopRunSpecific
#13 0x0296a048 in CFRunLoopRunInMode
#14 0x031d289d in GSEventRunModal
#15 0x031d2962 in GSEventRun
#16 0x0058ede1 in UIApplicationMain
#17 0x00002b9c in main at main.m:14
#


感谢您的建议。

尝试使用以下方法将其实例化为自动释放对象:

[NSMutableURLRequest requestWithURL:my_http_url];

我认为,在这种情况下,由于 应用程序崩溃,然后自动重启(它是iPad/iPhone应用程序),所以 仪器历史已不复存在。

我认为将NSMutableURLRequest实例化为自动删除对象没有多大意义 因为它需要在异步调用跨越多个 空闲循环周期。NSURLConnection可以在内部保留,也可以不保留,但保留 额外的安全参考不应受到伤害。

初始化代码基本上可归结为以下内容:

rq->url\u encoded=[url\u encode(rq->url)retain]
rq->http_url=[NSURL URLWithString:rq->url_encoded]
rq->http_-request=[[NSMutableURLRequest alloc]initWithURL:rq->http_-url]
[rq->http_请求setHTTPMethod:@“GET”]

NSArray*availableCookies=[rq->service.CookieJar-cookiesForURL:rq->http_-url]
NSDictionary*头文件=[NSHTTPCookie requestHeaderFieldsWithCookies:availableCookies]
[rq->http_请求setAllHTTPHeaderFields:headers]
rq->http_连接=[NSURLConnection alloc]

[rq->http\U连接initWithRequest:rq->http\U请求委托:rq 立即开始:是]

释放过程是connectionDidFinishLoading调用[rq->http\U连接 取消]和[rq自动释放],后者最终导致:

//[http_请求自动释放]
//延迟自动释放(http_请求)
[http_连接自动释放]
[http_url自动释放]
[网址发布]
[url_编码发布]
[回应释放]
请注意,[response release]只对在DidReceiverResponse中执行的前一个[response retain]进行配对

如果我将前两行注释掉,NSURLRequest将泄漏引用 每个仪器计数1,这是唯一观察到的泄漏。
每当我尝试以上述任何方式自动释放http_请求时,
发生崩溃。

使用NSDebugEnabled/NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled后,我发现了问题:

结果

http_url = [NSURL URLWithString:...]

应该保留或不自动删除。

retainCount
永远不会降为零,因此这不是非常有用的信息。工具总是查看对象的保留/释放/自动释放历史记录的更好方法。不要告诉我们它“归结为什么”,向我们展示代码。什么是rq?它是Objective-C对象的实例吗?它是如何创建的?