Giả sử tôi có một lớp (không ARC môi trường):Tham chiếu đến các biến Ví dụ bên trong một khối
@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];
}
Nếu khối của tôi được khởi công và sau đó mọi thứ khác giữ một tham chiếu đến thể hiện của đối tượng này sẽ giải phóng nó , tôi đảm bảo rằng dealloc sẽ không được gọi là vì khối lồng nhau đề cập đến một biến dụ (và để tự) - dealloc đó sẽ xảy ra sau khi thoát khỏi khối lồng nhau? Sự hiểu biết của tôi là khối của tôi có một tham chiếu mạnh mẽ để tự, vì vậy điều này nên được kosher.
Đây là lý do tại sao tôi thích 'self-> ivar.property', vì tôi có thể _see_ nó giữ lại' self'. Không chỉ 'ivar.property', mà thực tế được mở rộng bằng' self-> '. – Tricertops
Không nên sử dụng self-> ivar nếu tự trở thành nil nó sẽ gây ra sự cố. Nó là tốt hơn để xác định nó như là tài sản khi bạn sử dụng nó trong một khối, và sử dụng __weak tự để ngăn chặn chu kỳ giữ lại. –