代码之家  ›  专栏  ›  技术社区  ›  Antti

使用nsoperation时执行错误访问

  •  2
  • Antti  · 技术社区  · 15 年前

    这和我遇到的问题差不多,只是代码不同: http://www.cocoabuilder.com/archive/message/cocoa/2009/3/24/233015

    我想将一些处理卸载到nsoperation,传递一个文件名作为nsoperation加载和解析的引用。应用程序崩溃 EXEC_BAD_ACCESS 进入时 -(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;
    }
    

    在剥离了我在手术中的所有东西之后,我仍然会以撞车而告终。以下代码崩溃:

    #import "FilterParseOperation.h"
    
    @implementation FilterParseOperation
    
    - (id)initWithContentsOfFile:(NSString *)aFilename {
        filename = aFilename;
        return self;
    }
    
    - (void)dealloc {
        [filename release], filename = nil;
        [super dealloc];
    }
    
    - (void)main {
        // do nothing!
    }
    
    @end
    

    下面是崩溃的汇编程序输出(我不太懂忍者的话)。这是直接在操作后发生的

    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]
    

    有什么想法吗?:)

    2 回复  |  直到 15 年前
        1
  •  5
  •   kperryua    15 年前

    你应该打电话来 [super init]; 在里面 -initWithContentsOfFile: . nsOperation可能会在那里执行一些使其工作所需的设置。

        2
  •  0
  •   Redwood    15 年前

    除了缺乏 [super init] 上面提到的,看起来你没有保留 filename 在里面 initWithContentsOfFile: .如果 文件名 在操作执行之前释放并释放。