0

私はココア プログラミングの初心者ですが、C++ でかなりの作業を行いました。

NSSavePanel クラスに問題があります。(以下に示すように) 使用するたびに、(ブレークポイントを使用して) コードが終了ブラケットを実行しようとしていることがわかります。次に、main.h ファイルで Xcode から BAD_ACCESS メッセージを取得します。私は一生、自分が間違っていることを理解することはできません。コードは次のとおりです。

- (void)scannerDevice:(ICScannerDevice*)scanner didCompleteScanWithError:(NSError*)error;
{
    NSLog( @"scannerDevice: \n%@\ndidCompleteScanWithError: \n%@\n", scanner, error );
    [mProgressIndicator setHidden:YES];

    NSSavePanel *savePopup = [[NSSavePanel alloc]init];
    [savePopup runModal];

    NSMutableString *saveString = [[NSString alloc] init];
    saveString = [[savePopup URL] absoluteString];
    [saveString deleteCharactersInRange:NSMakeRange(0, 16)];
    [saveString appendString:@".jpeg"];

    NSLog(@"[[ADDRESS: %@", saveString); //Outputs /Users/tannerdsilva/Documents/TestFolder/NewName.jpeg
    NSError *errorSave = [[NSError alloc] init];

    [manager moveItemAtPath:[@"~/Foo.jpeg" stringByExpandingTildeInPath] toPath:[[savePopup URL] absoluteString] error:&errorSave]; // ~/Foo.jpeg does exist

    NSLog(@"ERROR: %@", errorSave);
    [saveString dealloc];
    [savePopup dealloc];

}

新しい宛先をハードコーディングして NSSavePanel を削除すると、クラッシュは発生しません。

事前に感謝します。これが簡単な修正である場合はお詫び申し上げます。

4

2 に答える 2

2

コードにはいくつかの問題があります。

  • として宣言saveStringしますNSMutableStringが、(不変)として初期化しますNSString
  • その場合、その文字列はまったく使用しませんが、NSStringから返された自動解放された(そして不変の)文字列に置き換えてabsoluteString、元の文字列をリークさせます。
  • NSStringにも応答もしませdeleteCharactersInRange:appendString(これらはのメソッドですNSMutableString)。
  • とにかくerrorSave初期化する必要があるリークが発生しています。nil
  • 自分自身を呼び出すことは絶対にしないでください。代わりdeallocに使用してください。releaseただし、すでに自動リリースされているため、リリースしないsaveStringでください(上記を参照)。ここでリリースしすぎると、自動リリースプールが空になるとクラッシュが発生します。
于 2011-08-26T02:21:41.757 に答える
1

わかりました。コードにいくつか問題があります。


メソッドシグネチャの末尾にセミコロンがあります

(void)scannerDevice:(ICScannerDevice*)scanner didCompleteScanWithError:
    (NSError*)error;

編集:@omzと@Rudy Velthuisによると、実装メソッドの署名の末尾のセミコロンは、Objective-Cで許可されています。したがって、この「問題」は無視できます。


パネルを保存するためのハンドルを取得するには、クラスインスタンスを使用する必要があります

NSSavePanel * savePanel = [NSSavePanel savePanel];

保存パネルをモーダルで実行した結果を確認する必要があります

if ([savePanel runModal] == NSOKButton) {
    //...
}

* NSStringのインスタンスを作成し、それをリークしています。まったく不要です*

NSMutable * saveString = [NSMutableString stringWithString: 
   [[savePopup URL] absoluteString]];

上記の問題を修正したら、オブジェクトが自動解放されるため、2つのdealloc行を削除する必要があります。通常、 deallocではなく、コードでreleaseを呼び出したいことに注意してください。

于 2011-08-26T02:08:55.577 に答える