2012-11-06 26 views
10

Cách thích hợp để thêm đối tượng vào NSMutableArray được xác định mạnh bằng thuộc tính là gì.Cách thích hợp để tránh Giữ lại Chu kỳ khi sử dụng khối

[tapBlockView setTapBlock:^(UIImage* image) { 
    [self.myImageArray addObject:image]; // self retain cycle 
} 

Nếu tôi sẽ tạo ra một cái gì đó tham khảo yếu như

__weak NSMutableArray *array = self.myImageArray; 
[tapBlockView setTapBlock:^(UIImage* image) { 
    [array addObject:image]; // If I will do this then how will I update original Array ? 
} 

Tôi cũng đã cố gắng

__weak id weakSelf = self; 
[tapBlockView setTapBlock:^(UIImage* image) { 
    [weakSelf storeImageInaNewMethod:image]; // Calling SToreImageInaNewMethod 
} 

-(void)storeImageInaNewMethod:(UIImage*)image { 
    [self.myImageArray addObject:image]; // This again retaining cycle 
} 

cách thích hợp để cập nhật đối tượng ban đầu là gì được xác định bởi tài sản?

+0

Blocks cũng giống như chức năng pointers.Can't bạn chỉ cần thiết lập các khối để nil khi bạn không cần nó nữa? –

Trả lời

8

Thử kết hợp số 2 và thứ 3.

__weak id weakSelf = self; 
[tapBlockView setTapBlock:^(UIImage* image) { 
    [weakSelf.myImageArray addObject:image]; 
} 
+0

Lưu ý rằng điều này chỉ hợp lệ nếu bạn sử dụng weakSelf trên dòng đầu tiên của khối, nếu bạn làm bất cứ điều gì khác đầu tiên sau đó bạn cần câu trả lời của Kaan. – malhal

0

Thứ hai và thứ ba của bạn xuất hiện chính xác. Cái thứ hai hoạt động vì bạn không tạo bản sao của mảng, do đó vẫn còn trỏ đến bản gốc. Cái thứ ba hoạt động bởi vì tham chiếu đến bản thân là yếu.

+0

Cái thứ hai chỉ hoạt động nếu 'self.myImageArray' trả về một tham chiếu trực tiếp đến ivar. Đó có thể không phải là một giả định an toàn. – rmaddy

+0

Đúng, đó là một điểm tốt –

12

Sau câu trả lời Maddy của - đây là từ năm 2012 WWDC bài giảng trên GCD và lập trình không đồng bộ:

__weak MyClass *weakSelf = self; 

[tapBlockView setTapBlock:^(UIImage* image) { 
    __strong MyClass *strongSelf = weakSelf; 
    if(strongSelf) { 
     [strongSelf.myImageArray addObject:image]; 
    } 
}]; 
+0

Tôi không hiểu tại sao bạn lại thay đổi thành __strong? Tôi đoán chỉ có mã này là đủ? [weakSelf.myImageArray addObject: image]; – Tariq

+6

Lý do cho phép quay trở lại '__strong' là để đảm bảo rằng nếu' weakSelf' vẫn còn sống khi dòng đầu tiên của khối được thực hiện, nó sẽ tiếp tục sống cho phần còn lại của việc thực thi khối. –

+0

Nếu bạn bật cảnh báo thì bạn sẽ thấy lý do tại sao __strong là cần thiết: Biến yếu có thể biến mất bất kỳ lúc nào, kể cả ở giữa cuộc gọi weakSelf.myImageArray mà chắc chắn sẽ gây ra rắc rối. – gnasher729

1

Trong trường hợp của bạn, bạn chỉ cần phải tham khảo một mảng mà được tham chiếu bởi self, vì vậy:

NSMutableArray *array = self.myImageArray; 
[tapBlockView setTapBlock:^(UIImage* image) 
          { 
          [array addObject:image]; // No cycle 
          }]; 

Hoạt động tốt cung cấp rằng self.myImageArray không trả về các tham chiếu mảng khác nhau ở khác nhau ent lần. Không có chu kỳ: đối tượng hiện tại tham chiếu mảng và khối, và lần lượt khối tham chiếu mảng.

Nếu self.myImageArray không trả lại tài liệu tham khảo mảng khác nhau như thời điểm khác nhau sau đó sử dụng một tài liệu tham khảo yếu để self, trường hợp của bạn 3.

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