【发布时间】:2010-11-01 22:45:53
【问题描述】:
我在释放 NSMutableURLRequest 对象时遇到问题。 请求对象释放期间应用程序崩溃。
对象是通过 [[NSMutableURLRequest alloc] initWithURL:my_http_url]; 创建的;
作为主流的控制流,我尝试释放连接对象以响应 connectionDidFinishLoading 处理程序被调用。
起初我尝试在 connectionDidFinishLoading 处理程序中自动释放 NSMutableURLRequest。这导致了崩溃,所以我认为这可能是因为连接类在调用 connectionDidFinishLoading 之前在内部推送了自动释放池,并且仍然希望在处理程序返回时连接对象是有效的,因此不可能在 connectionDidFinishLoading 中释放或自动释放连接对象。
如果我根本不释放 NSMutableURLRequest,根据 Instruments 的说法,它会以引用计数 1 泄漏。
因此,我决定通过触发自动释放 NSMutableURLRequest 传递给它的 NSRunLoop 事件来延迟释放。 这仍然会导致崩溃。
调用自动释放前的retainCount 为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
感谢您的建议。
【问题讨论】:
-
retainCount永远不会下降到零,所以这不是非常有用的信息。 Instruments 始终是查看对象的保留/释放/自动释放历史记录的更好方法。
标签: objective-c cocoa