У меня есть кусок кода:
//in the interface file
//...
NSMutableSet * someSet;
//...
//
//in the implementation file
//-(id)init {
if(self = [super self])
{
someSet = [[NSMutableSet alloc] init];
}
return self;
}
-(void)someFunc
{
NSLog(@"someSet count: %lu", [someSet count]); //always shows some number
array = ... //getting array from another function
for(SomeObject * obj in array)
{
NSSomeOperation * op = [[NSSomeOperation alloc] initWithValue:[obj someValue]];
//start operation
[someSet addObject:[obj someValue]];
}
}
//this function is called from another thread (from operation) through notification
//
-(void)someAnotherFunc
{
@synchronized(self)
{
int size = [someSet count]; //HERE size = 0, but it must be some count
NSLog(@"someSet: %@", someSet); // it outputs: "someSet: {()}"
NSLog(@"someSet count: %lu", [someSet count]); // it outputs: "someSet count: (null)"
}
}
Проблема в том, что size = 0 в someAnotherFunc, но это должно быть некоторое количество. И я знаю, это потому, что someAnotherFunc вызывается из другого потока, а в этом потоке someSet = nil.
Я пытался выполнить executeSelectorOnMainThread, но это не помогает.
UPDATE:
Я отлаживал это, дважды вызывал someFunc, и someSet является допустимым объектом во время этих вызовов и имеет некоторое количество объектов. Я записал количество в someFunc - и выводит правильное количество объектов.
Это происходит только при включенной ARC, до того, как ARC был включен - все было хорошо.
Кажется, это защита от потоков или ARC для предотвращения использования данных из разных потоков. Может быть, я не прав, но я не понимаю, почему это происходит.
Во время выполнения этого фрагмента кода someSet напрямую не назначается nil. И это не освобождается.
Кто-нибудь знает, как получить доступ к объекту someSet из другого потока? Как получить действительное количество объектов в someSet?