Iphone 使用NSOperation时执行错误访问
这与我遇到的问题几乎相同,只是代码非常不同: 我想将一些处理卸载到NSOperation,将文件名作为NSOperation加载和解析的引用传递。当输入Iphone 使用NSOperation时执行错误访问,iphone,objective-c,cocoa-touch,nsoperation,Iphone,Objective C,Cocoa Touch,Nsoperation,这与我遇到的问题几乎相同,只是代码非常不同: 我想将一些处理卸载到NSOperation,将文件名作为NSOperation加载和解析的引用传递。当输入-(void)init时,应用程序在执行错误访问时崩溃 以下是我如何开展这些行动: int n = [files count]; for (int i = 0; i < n; i++) { NSString *filename = [files objectAtIndex:i]; FilterParseOperation *
-(void)init
时,应用程序在执行错误访问时崩溃
以下是我如何开展这些行动:
int n = [files count];
for (int i = 0; i < n; i++) {
NSString *filename = [files objectAtIndex:i];
FilterParseOperation *parser = [[FilterParseOperation alloc] initWithContentsOfFile:filename];
[filterParseQueue addOperation:parser];
[parser release], parser = nil;
}
这里是崩溃的汇编输出(我不是忍者,不足以理解它所说的话)。这直接发生在添加操作之后
0x305ce610 <+0000> push ebp
0x305ce611 <+0001> mov ebp,esp
0x305ce613 <+0003> push ebx
0x305ce614 <+0004> sub esp,0x14
0x305ce617 <+0007> call 0x305ce61c <__opLock+12>
0x305ce61c <+0012> pop ebx
0x305ce61d <+0013> mov eax,DWORD PTR [eax+0x4]
0x305ce620 <+0016> mov edx,DWORD PTR [eax+0x14] <- Crash happens here
0x305ce623 <+0019> mov eax,DWORD PTR [ebx+0xbfe94]
0x305ce629 <+0025> mov DWORD PTR [esp+0x4],eax
0x305ce62d <+0029> mov DWORD PTR [esp],edx
0x305ce630 <+0032> call 0x306af856 <dyld_stub_objc_msgSend>
0x305ce635 <+0037> add esp,0x14
0x305ce638 <+0040> pop ebx
0x305ce639 <+0041> leave
0x305ce63a <+0042> ret
0x305ce63b <+0043> nop DWORD PTR [eax+eax+0x0]
0x305ce610推送ebp
0x305ce611电动制动踏板,esp
0x305ce613推式ebx
0x305ce614子esp,0x14
0x305ce617呼叫0x305ce61c
0x305ce61c pop ebx
0x305ce61d mov eax,DWORD PTR[eax+0x4]
0x305ce620 mov-edx,DWORD-PTR[eax+0x14]您应该调用[super-init]代码>在-initWithContentsOfFile:
中。NSOperation可能会在那里进行一些必要的设置。除了上面提到的缺少[super init]
之外,您似乎没有在initWithContentsOfFile:
中保留文件名。如果filename
在其他地方发布并在操作执行之前解除分配,这可能会导致问题。是的,我也注意到了这一点。当我从代码中剥离出所有内容,试图找到问题时,这就出现了。没有回溯,程序集是无用的。而且即使是回溯也常常是不必要的。。。
0x305ce610 <+0000> push ebp
0x305ce611 <+0001> mov ebp,esp
0x305ce613 <+0003> push ebx
0x305ce614 <+0004> sub esp,0x14
0x305ce617 <+0007> call 0x305ce61c <__opLock+12>
0x305ce61c <+0012> pop ebx
0x305ce61d <+0013> mov eax,DWORD PTR [eax+0x4]
0x305ce620 <+0016> mov edx,DWORD PTR [eax+0x14] <- Crash happens here
0x305ce623 <+0019> mov eax,DWORD PTR [ebx+0xbfe94]
0x305ce629 <+0025> mov DWORD PTR [esp+0x4],eax
0x305ce62d <+0029> mov DWORD PTR [esp],edx
0x305ce630 <+0032> call 0x306af856 <dyld_stub_objc_msgSend>
0x305ce635 <+0037> add esp,0x14
0x305ce638 <+0040> pop ebx
0x305ce639 <+0041> leave
0x305ce63a <+0042> ret
0x305ce63b <+0043> nop DWORD PTR [eax+eax+0x0]