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。我创建了一个名为 UpdateGUI 的函数,它将用来帮助我更新所有的 NSString。像这样,

    -(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

1
  • ARC还是没有?

  • 如果发生崩溃,请发布回溯

  • 用 an包围performInBackground:...调用@autoreleasepool什么都不做(也无济于事NSAutoreleasePool——你需要自动释放池在执行线程中

  • 如果变量涉及崩溃,显示变量的声明和初始化

  • 同时产生一堆线程来完成一堆工作可能比按顺序完成工作要慢。应始终控制并发性。如果你有一个长时间运行的任务,你可能想要启动第二个线程。或者您可能想要重新排序操作。但是,问题在于一次运行多个线程,特别是如果这些线程正在执行大量 I/O,只会增加争用,并且可能会使事情变慢,通常会慢很多。

很有可能,在后台线程上计算的对象之一在主线程尝试使用它之前就被释放了。你如何确保resultDupPhotos线程之间有效?

于 2013-05-22T15:55:40.090 回答