假設我有一個類(非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不會被調用,因爲嵌套塊引用了一個實例變量(和self) - dealloc會在嵌套塊退出後發生?我的理解是,我的街區對自我很有借鑑意義,所以這應該是猶太教。
這就是爲什麼我更喜歡'self-> ivar.property',因爲我可以看到它保留了'self'。不僅僅是'ivar.property',它實際上通過'self->來擴展。 – Tricertops
如果自己變成零,那麼使用self> ivar是不好的,它會導致崩潰。在塊中使用它時最好將其定義爲屬性,並使用__weak self來防止保留週期。 –