在非ARC应用程序中,我有一个NSOperation子类,它由委托排队,如下所示:
// 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]];
});
}由于[self委托doSomething:self元素]将在我的NSOperation对象可能已被释放后调用,所以在将此操作添加到队列之前,是否需要确保在委托中保留“元素”?元素对象保留在应用程序的其他地方,但可能会在那里发布。我需要确保当我的委托从NSOperation收到它时,它仍然是一个有效的对象。
只是想知道在dispatch_async中调用它的行为是否会保留传递给它的参数。当然,我可以使用NSInvocation和performSelectorOnMainThread来保留它。
发布于 2016-10-29 23:18:46
队列在进入队列时将保留块,块将保留它捕获的对象,如self。因为这里的self对它的element有很强的引用,所以element将至少在块运行之后才有效。
注意,对象对其委托的强烈引用是不寻常的:确保在那里没有一个完整的保留周期。
https://stackoverflow.com/questions/40324438
复制相似问题