В не-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, который сохранил бы его.
Извините - self возвращается из init. Я не добавил этого к моему вопросу, но он есть в исходном коде. – Trygve
Джош прав (см. Ниже). См. [Блоки 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