2012-05-03 38 views
6

Tôi có một khối trong đó tôi sử dụng self vì vậy tôi tuyên bố một tài liệu tham khảo yếu để tự:khối lồng nhau và tài liệu tham khảo để tự

__weak MyClass *weakSelf = self; 

Bây giờ câu hỏi của tôi:

  1. tôi nhận được một lỗi nơi tôi define weakSelf và tôi không hiểu điều này có nghĩa là gì:

    không thể chỉ định thuộc tính yếu trên biến tự động

  2. Bên trong khối của tôi, tôi vượt qua weakSelf đến khối khác và tôi không chắc chắn nếu bây giờ tôi phải làm điều tương tự một lần nữa như vậy:

    __weak MyClass *weakWeakSelf = weakSelf; 
    

    Và sau đó vượt qua weakWeakSelf để khối đó?

+0

Bạn đã tìm thấy câu trả lời cho điều này chưa? Phần yếu tôi có ý nghĩa. –

Trả lời

8

này rất có thể xảy ra khi bạn đang nhắm mục tiêu xuống iOS 4. Bạn nên thay đổi nó được

__unsafe_unretained MyClass *weakWeakSelf = weakSelf; 
+0

Mục tiêu là 5.0 ... – Besi

+0

Vui nếu tôi thay đổi 'Mục tiêu triển khai' thành <5.0 Tôi nhận được lỗi mà bạn có. nhưng trên đó là tốt. Điều này có giải quyết được sự cố không? –

+0

Tôi có phải khai báo weakWeakSelf không? – Besi

3

Với ARC

__weak __typeof__(self) wself = self; 

wihtout ARC

__unsafe_unretained __typeof__(self) wself = self; 
1

Với libextobjc nó sẽ có thể đọc được và dễ dàng:

- (void)doStuff 
{ 
    @weakify(self); 
    // __weak __typeof__(self) self_weak_ = self; 

    [self doSomeAsyncStuff:^{ 

     @strongify(self); 
     // __strong __typeof__(self) self = self_weak_; 

     // now you don't run the risk of self being deallocated 
     // whilst doing stuff inside this block 
     // But there's a chance that self was already deallocated, so 
     // you could want to check if self == nil 

     [self doSomeAwesomeStuff]; 

     [self doSomeOtherAsyncStuff:^{ 

      @strongify(self); 
      // __strong __typeof__(self) self = self_weak_; 

      // now you don't run the risk of self being deallocated 
      // whilst doing stuff inside this block 
      // Again, there's a chance that self was already deallocated, so 
      // you could want to check if self == nil 

      [self doSomeAwesomeStuff]; 

     }]; 
    }]; 
} 
Các vấn đề liên quan