बनाए रखने के बेहतर प्रश्न समझने के लिए, ब्लॉक प्रत्यावर्तन के निम्नलिखित सरलीकृत रूप पर विचार तोड़ने:ब्लॉक प्रत्यावर्तन और चक्र
__block void (^next)(int) = ^(int index) {
if (index == 3) {
return;
}
int i = index;
next(++i);
};
next(0);
XCode (एआरसी-सक्षम) ने चेतावनी दी है "कैप्चर 'अगले' दृढ़ता से में इस ब्लॉक है कि एक बनाए रखने चक्र की संभावना "।
सहमत हुए।
प्रश्न 1: बनाए रखने चाहेंगे चक्र सफलतापूर्वक इस फैशन में nil
को ब्लॉक खुद की स्थापना, द्वारा तोड़ा जा:
__block void (^next)(int) = ^(int index) {
if (index == 3) {
next = nil; // break the retain cycle
return;
}
int i = index;
next(++i);
};
next(0);
(नोट: यदि आप अभी भी वही चेतावनी मिलती हैं, लेकिन शायद यह अनचाहे है)
प्रश्न 2: ब्लॉक रिकर्सन का बेहतर कार्यान्वयन क्या होगा?
धन्यवाद।
मुझे किसी भी तरह से __block क्यों घोषित किया गया है? यह कब्जा नहीं किया गया है। –
@Catfish_Man, यह '__block int i' है क्योंकि यह कोड की अगली पंक्ति में संशोधित है। – krisk
यह कोड संभवतः काम नहीं कर सका; अगला संकलित नहीं किया जाता है जब तक कि ब्लॉक संकलित नहीं किया जाता है। इस प्रकार, ब्लॉक के भीतर अगली कॉल दुर्घटनाग्रस्त हो जाएगी। –