2011-12-19 16 views
15

आईओएस NULL या nil में animateWithDuration:animations:completion: में समापन ब्लॉक में पास होने पर आईओएस चिल्लाता नहीं है लेकिन क्या इसका मतलब यह ठीक है? या क्या खाली ^{ } खोलना बेहतर है?क्या एनयूएलएल में ब्लॉक पैरामीटर में पास करना ठीक है?

उत्तर

38

यह ठीक है जब तक आप भरोसा कर सकते हैं कि जिस कोड को आप nil पास कर रहे हैं उसे ब्लॉक के रूप में कॉल करने का प्रयास नहीं किया जाएगा।

एक त्वरित प्रदर्शन:

typedef void (^GenericBlock)(void); 

void useThisBlock(GenericBlock block){ 
    block(); 
} 

useThisBlock(^{NSLog(@"All okay.");}); 
useThisBlock(nil); // Compiles but crashes 

भीतरी कोड ब्लॉक पहले जांच करना चाहिए: if(block) block();

UIKit कोड के मामले में, आप ठीक होना चाहिए।

+2

"* UIKit कोड के मामले में, आपको ठीक होना चाहिए। *" उद्धरणों की आवश्यकता है? – Manav

+0

@ मानव: आप गलत नहीं हैं - सत्यापित करने का कोई तरीका नहीं है (सिवाय इसके कि यह क्रैश नहीं होता है)। –

6

nil पास करना ठीक है, और मेरी राय में क्लीनर-रीडिंग कोड उत्पन्न होता है।

यदि आप पूर्णता ब्लॉक का उपयोग नहीं करना चाहते हैं, तो इस मामले के लिए आप [UIView animateWithDuration:animations:] विधि का भी उपयोग कर सकते हैं।

+0

धन्यवाद, मुझे पता है कि एनीमेशन ब्लॉक के बिना कोई तरीका है। मेरा सवाल ब्लॉक के बारे में अधिक है। तो क्यों 'शून्य', न 'एनएलएल'? – pixelfreak

+0

'शून्य 'और' न्यूल 'बराबर हैं। सम्मेलन से, उद्देश्य-सी आम तौर पर 'शून्य' का उपयोग करता है जहां सी – sho

+10

में 'NULL' का उपयोग किया जाता है जो कि एआरसी में बिल्कुल सही नहीं है। 'शून्य 'का मतलब ऑब्जेक्ट और उपयोग किया जाना चाहिए जहां' आईडी' की अपेक्षा की जाती है, जबकि 'NULL' का अर्थ गैर-ऑब्जेक्ट गैर वैध पॉइंटर होता है और इसका उपयोग किया जाना चाहिए जहां' (शून्य *) 'अपेक्षित है। अधिक जानकारी के लिए [इस] (http://stackoverflow.com/questions/557582/null-vs-nil-in-objective-c) प्रश्न पर एक नज़र डालें। –

संबंधित मुद्दे