我在performInvocation:方法中遇到ASIHTTPRequest崩溃。
堆栈是:
ASIHTTPRequest performInvocation:onTarget:releasingObject: 1877
ASIHTTPRequest performSelector:onTarget:withObject:amount:callerToRetain: 1870
ASIHTTPRequest updateProgressIndicator:withProgress:ofTotal: 1903
ASINetworkQueue request:didReceiveBytes: 240
ASIHTTPRequest performInvocation:onTarget:releasingObject: 1877
这是发生崩溃的方法:
+ (void)performInvocation:(NSInvocation *)invocation onTarget:(id *)target releasingObject:(id)objectToRelease
{
if (*target && [*target respondsToSelector:[invocation selector]]) {
[invocation invokeWithTarget:*target];
}
CFRelease(invocation);
if (objectToRelease) {
CFRelease(objectToRelease);
}
}
我相信它会在invokeWithTarget调用中发生。
这种情况很少发生,但在大规模部署中,它发生了很多。
在搜索时,我发现了一个模糊的参考:
[cbInvocation retainArguments];
返回performSelector:...在[cbInvocation performSelectorOnMainThread:...]调用之前。但它似乎并不具有权威性,而且我不确定我是否知道那里发生了什么,足以制造和/或信任这种变化。我无法在本地重现问题,但是我从现场获得了大量的崩溃报告。
顺便提一句,这是关于iOS代码的。
任何人都知道这可能是什么?
答案 0 :(得分:0)
您的downloadProgressDelegate已被释放,而不是首先从ASIHTTPRequest的downloadProgressDelegate中删除它。
在下载进度委托的dealloc实现中,请致电:
[request setDownloadProgressDelegate:nil];