2011-02-07 6 views
0

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


Почему доступ к счету 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 
  • Почему это не синхронизация ?! Что еще может быть?

ответ

0

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

Итак, решение для моего проблема была:

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

0

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

+0

Да, как я сказал, singleton 1 == singleton 2. См. редактирование. – Torkel