Iphone 使用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 *

这与我遇到的问题几乎相同,只是代码非常不同:

我想将一些处理卸载到NSOperation,将文件名作为NSOperation加载和解析的引用传递。当输入
-(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]