2

これは、非常に異なるコードを除いて、私が抱えている問題とほとんど同じです: 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;
}

NSOperation にあるものをすべて取り除いた後でも、クラッシュが発生します。次のコードはクラッシュします。

#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

これがクラッシュのアセンブラー出力です (私はそれが何を言っているのか理解できるほど忍者ではありません)。これは、__opLock の addOperation の直後に発生します

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]

何か案は?:)

4

2 に答える 2

5

[super init];に電話する必要があります-initWithContentsOfFile:。NSOperation は、動作するために必要ないくつかのセットアップを行う可能性があります。

于 2009-09-02T20:08:14.510 に答える
0

上記の欠如に加えて、それはあなたがに保持して[super init]いるようには見えません。これは、操作が実行される前に他の場所で解放され、割り当てが解除された場合に問題を引き起こす可能性があります。filenameinitWithContentsOfFile:filename

于 2009-09-02T20:15:46.367 に答える