2016-10-29 4 views
0

В не-ARC приложение, у меня есть подкласс NSOperation, который помещается в очередь делегата и выглядит как:dispatch_async и сохранить (не ARC)

// note that the delegate and element properties are retained 

-(id)initWithDelegate:(id<SomeDelegate>)inDelegate element:(SomeElement *)inElement 
{ 
    if (self = [super init]) 
    { 
     [self setDelegate:inDelegate]; 
     [self setElement:inElement]; 
    } 
} 

-(void)dealloc 
{ 
    [_delegate release]; 
    [_element release]; 
    [super dealloc]; 
} 

-(void)main 
{ 
    // do stuff 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [[self delegate] doSomething:[self element]]; 
    }); 
} 

С [[самоуправления делегата] DoSomething: [я element]] будет вызываться после того, как мой объект NSOperation, скорее всего, был освобожден, нужно ли обязательно сохранить «элемент» в делететете перед добавлением этой операции в очередь? Элемент-элемент сохраняется в другом месте приложения, но он потенциально может быть выпущен там. Мне нужно убедиться, что, когда мой делегат вернет его из NSOperation, он все еще является действительным объектом.

Просто задайте вопрос, сохранит ли переданный ему аргумент в вызове dispatch_async. Я мог бы, конечно, использовать NSInvocation и выполнитьSelectorOnMainThread, который сохранил бы его.

+0

Извините - self возвращается из init. Я не добавил этого к моему вопросу, но он есть в исходном коде. – Trygve

+0

Джош прав (см. Ниже). См. [Блоки Objective-C] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW4) in _Blocks Темы программирования: блоки и переменные ._ – Rob

ответ

5

Очередь сохранит блок, когда он установлен в очередь, и Блок сохранит объекты, которые он захватывает, например self. Так как self здесь имеет сильную ссылку на его element, то element будет действителен, по крайней мере, до тех пор, пока не будет запущен блок.

Обратите внимание, что для объекта необычно иметь ссылку на его делегат: убедитесь, что у вас нет непрерывного цикла сохранения.

Смежные вопросы