NSMutableArray идет SIGABRT в многопоточном приложении ... но я _am_ делаю @synchronized! - PullRequest
0 голосов
/ 08 февраля 2011

Извините ... позор - Я не запускал режим отладки, поэтому ошибка обнаружилась не в той строке. В режиме отладки, показывающем правую строку, ошибка была простой ошибкой «не получить доступ к массиву за его пределами» (опечатка - я ссылался на один массив, но доступ был к другому)


Почему доступ к счетчику NSMutableArray приводит к появлению SIGABRT, когда я очищаю NSMutableArray из другого потока? Я думал, что @synchronized должен был делать, как следует из названия?

NSMutableArray *sourceImageRepArray;

...

@synchronized(self)
{
   NSLog(@"singleton 1 %p", self);
   unsigned long count = sourceImageRepArray.count; //SIGABRT here!
   ...

Не знаю, какой дополнительный код вы хотите, чтобы я поделился ... это код, который запускает его:

@synchronized([Singleton sharedSingleton])
{
   NSLog(@"singleton 2 %p", [Singleton sharedSingleton]);
   int i, n;
   n = [filenames count];
   for(i=0; i<n; i++){
      ImageRep *item = [[ImageRep alloc] init];
      [item setPath:[filenames objectAtIndex:i]];   
      [[Singleton sharedSingleton].targetImageRepArray insertObject:item atIndex: [targetImageBrowser indexAtLocationOfDroppedItem]];
      [item release];
      [[Singleton sharedSingleton] removeImageRepFromArray:[Singleton sharedSingleton].sourceImageRepArray withPath:[filenames objectAtIndex:i]];
   }
}

синглтон 1 == синглтон 2:

2011-02-08 07:22:03.265 Crash[60001:5d03] singleton 1 0x200047680
2011-02-08 07:22:03.433 Crash[60001:a0f] singleton 2 0x200047680
  • почему не синхронизируется ?! Что еще может происходить?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2011

Извините ... позор - Я не запускал режим отладки, поэтому ошибка обнаружилась не в той строке.В режиме отладки с правой строкой ошибки была простая ошибка «не получить доступ к массиву за его пределами» - ошибка (опечатка - я ссылался на один массив, но доступ был на другой)чтобы моя проблема была:

Не делайте NSLog-отладку в выпуске, это может пометить ошибки в неправильных строках.(иногда в многопоточных приложениях, наверное?)

0 голосов
/ 08 февраля 2011

Вы уверены, что вы и [Singleton sharedSingleton] - это один и тот же объект?

...