में __weak और __strong उपयोग कारण बताएं मुझे लगता है कि मैं मजबूत और कमजोर कीवर्ड अच्छी तरह से समझता हूं, लेकिन मुझे समझ में नहीं आता कि यह नीचे दिए गए कोड में कैसे उपयोग किया जाता है। यह कोड एसडीवेब इमेज से ओलिवियर पोइट्रे द्वारा जिथब पर उपलब्ध है। मैं यहां वर्णित मजबूत और कमजोर कीवर्ड समझता हूं: Explanation of strong and weak storage in iOS5SDWebImage कोड
नीचे दिया गया कोड __weak और __strong कीवर्ड का उपयोग करता है जो मेरे लिए उत्सुक है। यह बाल-अभिभावक संबंध या प्रतिनिधि पैटर्न नहीं है क्योंकि मुझे कमजोर इस्तेमाल करने के लिए उपयोग किया जाता है। हालांकि, मुझे यकीन है कि यह एक ऐसा पैटर्न है जिसका प्रयोग अक्सर किया जाता है, क्योंकि मैंने इसे दूसरे कोड में पहले देखा है। यह एक ब्लॉक से पहले एक __weak संदर्भ सेट करता है जो किसी अन्य धागे पर चलता है। फिर, ब्लॉक के भीतर, यह एक मजबूत संदर्भ के लिए कमजोर संदर्भ सेट करता है।
मुझे यकीन है कि यह अच्छा और सुरुचिपूर्ण कोड है, इसलिए मैं इसे समझने की कोशिश कर रहा हूं। यदि ब्लॉक चलाने से पहले "स्वयं" अस्तित्व में रहता है, तो कमजोर आत्म संदर्भ शून्य हो जाएगा। जब ब्लॉक चलता है, तो मजबूत संदर्भ शून्य पर भी सेट किया जाएगा। इसलिए, यह शेष ऑपरेशन को मारने के बारे में पता चलेगा क्योंकि स्वयं अब अस्तित्व में नहीं है। क्या मुझे यह अधिकार मिला?
अब, अगर हम __weak और __strong कीवर्ड का उपयोग नहीं करते तो क्या होगा? क्या होगा यदि हमने अभी ब्लॉक के अंदर जांच की है कि क्या स्वयं == शून्य है। ब्लॉक "पूरे" कभी भी शून्य नहीं होगा क्योंकि ब्लॉक पूरे पेड़ की प्रतिलिपि बनाता है?
क्या कोई इस कोड के इस अद्भुत टुकड़े को नष्ट करने में मदद कर सकता है? क्या कोई मेरी परिकल्पनाओं को सत्यापित या अस्वीकार कर सकता है?
- (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);
}
}
एक और शानदार जवाब। धन्यवाद nneonneo। –
यह "ऑब्जेक्ट की प्रारंभिक सफाई को सुविधाजनक बनाने के लिए" से अधिक है। यह वस्तु की सफाई को सुविधाजनक बनाता है - अन्यथा एक सतत चक्र होगा - 'स्वयं' सहयोगी संदर्भ के माध्यम से 'ऑपरेशन' को बनाए रखता है। 'ऑपरेशन' ब्लॉक को बरकरार रखता है। यदि ब्लॉक 'स्वयं' बनाए रखा गया तो यह एक चक्र होगा। – newacct