0

これが問題です。

  1. バックグラウンドで実行されている -(void)searchingInBackground というメソッドがあります (performSelectorInBackground)。

  2. このメソッドには、バックグラウンドでも実行されているいくつかの異なるスレッドがあります (performSelectorInBackground)。このような:

    -(void)searchingInBackground
    {
      @autoreleasepool {
        [self performSelectorInBackground:@selector(getDuplicatedPictures:) withObject:copyArray];
      }
    
      @autoreleasepool {
        [self performSelectorInBackground:@selector(getLocationsOfPhotos:) withObject:copyArray];
      }
    ... (and so on)
    }
    
  3. スレッド内の各関数 (つまり、getDuplicatedPictures、getLocationsOfPhotos...) では、最後に NSStrings が生成され、それらの文字列を使用してテキスト フィールド GUI を更新します。

  4. テキスト フィールドの GUI を更新するため。すべての NSString を更新するために使用する UpdateGUI という関数を作成しました。このような、

    -(void)UpdateUI
    {
       [_NumDupPhotosLabel(label for GUI)  setStringValue: resultDupPhotos(string from thread function which is getDuplicatedPictures in this case)];
        ....(includes all of my strings from threads)
    }
    
  5. 各スレッド関数で performSelectorOnMainThread を使用してこの UpdateGUI を呼び出すと、問題が発生します。EXC_BAD_ACCESS が表示されます。これが私がしたことです。例えば:

    -(void)getDupicatedPictures
    {
         resultDupPhotos = .....;
         [self performSelectorOnMainThread:@selector(UpdateUI) withObject:nil waitUntilDone:YES];
    }
    
  6. performSelectorOnMainThread を使用しない場合は、それらの関数に値を直接設定するだけで問題なく動作します。コードをよりよく整理したいだけです。

    -(void)getDuplicatedPictures
    {
         resultDupPhotos = .....;
         [_NumDupPhotosLabel  setStringValue: resultDupPhotos]; (works good and it will set the value to the GUI label)
    }
    

これを修正する方法を教えていただけますか?ありがとう!!!

4

1 に答える 1