假设我有一个类(非ARC环境):
@interface SomeObject : NSObject {
UILabel *someLabel;
dispatch_queue_t queue;
}
- (void)doAsyncStuff;
- (void)doAnimation;
@end
@implementation SomeObject
- (id)init {
self = [super init];
if (self) {
someLabel = [[UILabel alloc] init];
someLabel.text = @"Just inited";
queue = dispatch_queue_create("com.me.myqueue", DISPATCH_QUEUE_SERIAL);
}
return self;
}
- (void)doAsyncStuff {
dispatch_async(queue, ^{
...
// Do some stuff on the current thread, might take a while
...
dispatch_async(dispatch_get_main_queue(), ^{
someLabel.text = [text stringByAppendingString:@" in block"];
[self doAnimation];
}
}
}
- (void)doAnimation {
...
// Does some animation in the UI
...
}
- (void)dealloc {
if (queue) {
dispatch_release(queue);
}
[someLabel release];
[super dealloc];
}
如果我的块被踢掉然后其他所有持有对该对象实例的引用的东西都会释放它,我保证不会调用dealloc,因为嵌套块引用了一个实例变量(和自己) - - 嵌套块退出后会发生dealloc吗?我的理解是我的街区对自己有很强的参考价值,所以这应该是犹太人。
答案 0 :(得分:3)
这很好,因为你说过的原因。
需要注意的重要一点是,如果类(由self
表示)以任何方式保留块,您将创建一个保留周期。因为你是在线定义它并将其传递给dispatch_async
,所以你应该没问题。
答案 1 :(得分:0)
你是对的。该块在两种情况下保留自我:
你的嵌套块很适合这两个方面。因此,dealloc将在块执行完毕后发生。
另一个有趣的事情是你的queue
也是一个实例变量。我最初的想法是因为它是一个实例变量,self
也会被保留,直到块完成执行。但是,当我测试它时实际发生的情况只有queue
被保留并且self
被取消分配。我虽然找不到这方面的文件。