पर विचार करें निम्नलिखित कोड टुकड़ा:ब्लाकों, लूप और स्थानीय चर
for(/* some condition */) {
int x = rand();
[array addObject:^(){
NSLog(@"%d", x);
}]
}
for(void (^block)() in array) {
block();
}
अब मुझे लगता है कि पाश के लिए में एक्स करने के लिए आवंटित सभी मूल्यों को मुद्रित करने के लिए इस कोड स्निपेट उम्मीद होती है; हालांकि ऐसा लगता है कि सभी ब्लॉक एक ही 'एक्स' चर (संभवतः अंतिम एक) साझा करते हैं।
कोई विचार यह क्यों है और मैं ब्लॉक को कैसे परिभाषित कर सकता था क्योंकि प्रत्येक ब्लॉक में चर 'x' होता है क्योंकि ब्लॉक को परिभाषित किया गया था?
मैं अभी भी खुद को ब्लॉक सीख रहा हूं लेकिन यहां एक अजीब चीज दिमाग में आती है। जब आप addObject करते हैं:, सरणी डिफ़ॉल्ट रूप से ब्लॉक ऑब्जेक्ट को बनाए रखेगी। हालांकि, ब्लॉक ऑब्जेक्ट्स को स्टैक पर रखा जाता है जब उन्हें घोषित किया जाता है, तो ऐसा लगता है कि वे तुरंत दायरे से बाहर हो जाएंगे। ब्लॉक_Copy ब्लॉक को ढेर में ले जायेगा जो सही काम करने जैसा लगता है। –