Извините ... 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
- Почему это не синхронизация ?! Что еще может быть?
Да, как я сказал, singleton 1 == singleton 2. См. редактирование. – Torkel