किसी ब्लॉक के अंदर एक वेरिएबल को एक ब्लॉक के बाहर एक वेरिएबल में असाइन करें


381

मुझे एक त्रुटि मिल रही है

वैरिएबल असाइन करने योग्य नहीं है (लापता __block प्रकार निर्दिष्टकर्ता)

लाइन पर aPerson = participant;। मैं यह कैसे सुनिश्चित कर सकता हूं कि ब्लॉक aPersonचर तक पहुंच सकता है और aPersonचर वापस आ सकता है?

Person *aPerson = nil;

[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {   
    Person *participant = (Person*)obj;

    if ([participant.gender isEqualToString:@"M"]) {
        aPerson = participant;
        *stop = YES;
    }
}];

return aPerson;

जवाबों:


779

आपको अपनी समस्या के समाधान के लिए कोड की इस पंक्ति का उपयोग करना होगा:

__block Person *aPerson = nil;

अधिक जानकारी के लिए, कृपया इस ट्यूटोरियल देखें: ब्लॉक और वेरिएबल्स


101
कृपया ध्यान दें कि दो अंडरस्कोर के __blockसाथ उपसर्ग है ।
एरिक ब्रेटो

12
__blockमेरी त्रुटि का उपयोग किया गया है, लेकिन मूल्य ब्लॉक से बाहर नहीं है। यहाँ कोई मदद
User16119012

7
ब्लॉक को अच्छी तरह से बुलाया जाता है, जहां यह दिखता है कि इसे बुलाया जाना चाहिए, दूसरे शब्दों में, ब्लॉक 'सही दूर' नहीं चलते हैं।
टॉम एंडरसन

1
यदि ब्लॉक राइट AWAY नहीं चलते हैं, तो इसका उत्तर स्वीकार नहीं किया जाना चाहिए क्योंकि यह एक बड़ा सौदा ब्रेकर बनाता है।
दुराज़्नो

3
यह उत्तर पोस्ट किए गए प्रश्न के संबंध में सही है, यदि आपके मन में एक अलग परिदृश्य है, तो किसी अन्य प्रश्न को पोस्ट करने के लिए स्वतंत्र महसूस करें।
देवर्षि

40

बस एक गलती की याद दिलाते हुए मैंने खुद को भी,

 __block

घोषणा तब की जानी चाहिए जब पहली बार चर की घोषणा की जाती है, यानी ब्लॉक के बाहर, इसके अंदर नहीं। यह चर के बारे में टिप्पणियों में उल्लिखित समस्याओं को हल करना चाहिए जो ब्लॉक के बाहर इसके मूल्य को बनाए नहीं रखते हैं।


18

__blockब्लॉक के अंदर किसी भी प्रकार के चर को घोषित करने और असाइन करने के लिए बस उपसर्ग का उपयोग करें ।

उदाहरण के लिए:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

ब्लॉक के अंदर एक वैरिएबल असाइन करने के लिए जो ब्लॉक के बाहर हमेशा __ब्लॉक स्पेसियर का उपयोग करता है, इससे पहले कि वैरिएबल आपका कोड इस तरह होना चाहिए: -

__block Person *aPerson = nil;


3

__weakयदि आपको चक्र के उपयोग को बनाए रखने के बारे में कोई चेतावनी मिलती है तो कोशिश करें__block

Person *strongPerson = [Person new];
__weak Person *weakPerson = person;

अब आप weakPersonब्लॉक के अंदर ऑब्जेक्ट रेफर कर सकते हैं ।


3

हाँ ब्लॉक सबसे अधिक उपयोग की जाने वाली कार्यक्षमता है, इसलिए बनाए रखने के चक्र से बचने के लिए हमें ब्लॉक के अंदर स्वयं सहित मजबूत चर का उपयोग करने से बचना चाहिए, _weak या weakself का उपयोग करें।


0

जब मैंने वही त्रुटि देखी, तो मैंने इसे हल करने की कोशिश की:

   __block CGFloat docHeight = 0.0;


    [self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
        //height
        NSLog(@"=========>document.height:@%@",height);
        docHeight = [height floatValue];
    }];

और इसके काम ठीक है

चर से पहले बस " __block " जोड़ें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.