dispatch_async 并保留(非 ARC)
dispatch_async and retain (non-ARC)
在非 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 delegate] doSomething:[self element]] 将在我的 NSOperation 对象可能已被释放后调用,我是否需要确保在添加此操作之前在委托中保留 "element"排队?元素对象保留在应用程序的其他位置,但可能会在那里释放。我需要确保当我的委托从 NSOperation 收到它时,它仍然是一个有效的对象。
只是想知道在 dispatch_async 中调用它的行为是否会保留传递给它的参数。我当然可以使用 NSInvocation 和 performSelectorOnMainThread 来保留它。
队列在入队时会保留Block,Block会保留它捕获的对象,比如self
。由于这里的 self
对其 element
有强引用,因此 element
将至少在 Block 运行之前有效。
请注意,对象对其委托具有强引用是不常见的:确保那里没有完整的保留周期。
在非 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 delegate] doSomething:[self element]] 将在我的 NSOperation 对象可能已被释放后调用,我是否需要确保在添加此操作之前在委托中保留 "element"排队?元素对象保留在应用程序的其他位置,但可能会在那里释放。我需要确保当我的委托从 NSOperation 收到它时,它仍然是一个有效的对象。
只是想知道在 dispatch_async 中调用它的行为是否会保留传递给它的参数。我当然可以使用 NSInvocation 和 performSelectorOnMainThread 来保留它。
队列在入队时会保留Block,Block会保留它捕获的对象,比如self
。由于这里的 self
对其 element
有强引用,因此 element
将至少在 Block 运行之前有效。
请注意,对象对其委托具有强引用是不常见的:确保那里没有完整的保留周期。