Tôi nghĩ rằng tôi hiểu từ khóa mạnh và yếu, nhưng tôi không hiểu cách sử dụng từ khóa trong mã bên dưới. Mã này là từ SDWebImage bởi Olivier Poitrey có sẵn trên github. Tôi hiểu các từ khóa mạnh và yếu như được mô tả ở đây: Explanation of strong and weak storage in iOS5Giải thích __weak và __strong lý do sử dụng trong mã SDWebImage
Mã bên dưới sử dụng các từ khóa __weak và __strong theo cách tò mò với tôi. Nó không phải là một mối quan hệ cha mẹ hoặc mẫu đại biểu như tôi đã từng thấy yếu được sử dụng. Tuy nhiên, tôi chắc chắn rằng đây là một mẫu được sử dụng thường xuyên, như tôi đã nhìn thấy nó trước trong mã khác. Nó đặt một tham chiếu __weak trước một khối chạy trên một luồng khác. Sau đó, trong khối, nó đặt tham chiếu yếu đến tham chiếu mạnh.
Tôi chắc chắn rằng mã tốt và thanh lịch này, vì vậy tôi đang cố gắng hiểu nó. Nếu "tự" chấm dứt tồn tại trước khi khối chạy, thì tham chiếu tự yếu sẽ không ra. Khi khối chạy, tham chiếu mạnh sẽ được đặt thành 0. Vì vậy, nó sẽ biết để giết phần còn lại của hoạt động kể từ khi tự không tồn tại nữa. Tôi đã nhận được quyền này?
Bây giờ, điều gì sẽ xảy ra nếu chúng tôi không sử dụng từ khóa __weak và __strong? Điều gì xảy ra nếu chúng ta chỉ kiểm tra bên trong khối cho dù tự == không. Liệu "bản thân" có bao giờ là không vì khối sao chép toàn bộ cây?
Ai đó có thể giúp làm sáng tỏ đoạn mã tuyệt vời này? Ai đó có thể xác minh hoặc từ chối giả thuyết của tôi?
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock;
{
[self cancelCurrentImageLoad];
self.image = placeholder;
if (url)
{
__weak UIImageView *wself = self;
id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
__strong UIImageView *sself = wself;
if (!sself) return;
if (image)
{
sself.image = image;
[sself setNeedsLayout];
}
if (completedBlock && finished)
{
completedBlock(image, error, cacheType);
}
}];
objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}
Một câu trả lời tuyệt vời khác. Cảm ơn nneonneo. –
Nó không chỉ là "Để tạo điều kiện dọn dẹp sớm đối tượng". Nó tạo điều kiện làm sạch đối tượng ở tất cả - nếu không sẽ có một chu kỳ giữ lại - 'self' giữ lại' hoạt động' thông qua tham chiếu liên kết. 'hoạt động' giữ lại khối. Nếu khối được giữ lại 'self', nó sẽ là một chu kỳ. – newacct