2013-02-07 26 views
5

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.

Trả lời

3

Điều này là tốt, vì những lý do bạn đã nêu.

Điều quan trọng cần lưu ý là bạn sẽ tạo chu kỳ giữ lại, nếu lớp học (được biểu thị bằng self) giữ lại khối theo bất kỳ cách nào. Bởi vì bạn đang xác định nó trong dòng và chuyển nó đến dispatch_async, bạn nên ổn.

+1

Đâ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

+0

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. –

0

Bạn hoàn toàn đúng. Khối vẫn giữ nguyên trong hai trường hợp:

  1. Bạn sử dụng tự bên trong khối.
  2. Bạn truy cập một biến mẫu trực tiếp bên trong khối.

Khối lồng nhau của bạn tốt để thực hiện cả hai số. Do đó, dealloc sẽ xảy ra sau khi block đã thực hiện xong.

Một điều thú vị cần lưu ý là queue của bạn cũng là một biến mẫu. Suy nghĩ ban đầu của tôi là bởi vì nó là một biến cá thể, self cũng được giữ lại cho đến khi khối đã thực hiện xong. Tuy nhiên, những gì thực sự xảy ra khi tôi thử nghiệm nó chỉ là queue được giữ lại và self được deallocated. Tôi không thể tìm thấy tài liệu cho điều này mặc dù.

+0

"Suy nghĩ ban đầu của tôi là vì nó là một biến cá thể, bản thân nó cũng được giữ lại cho đến khi khối ..." Không, 'hàng đợi' không được sử dụng bên trong bất kỳ khối nào mà tôi có thể thấy – newacct

Các vấn đề liên quan