हालांकि, बदले में, कोड में से कोई भी यह जांच नहीं करता कि ऑब्जेक्ट मौजूद है या नहीं। लेकिन इसे जांचना चाहिए, और इसे कैसे संभाला जा सकता है?
आमतौर पर, nil
वापस आने पर उप-वर्गों द्वारा त्रुटि प्रबंधन को अनदेखा किया जाता है। nil
वापस लौटाए जाने पर त्रुटि प्रबंधन आमतौर पर कॉलर को छोड़ दिया जाता है। के रूप में मुहावरेदार -init
में प्रदर्शन:
- (id)init {
self = [super init];
if (self) {
// initialize
}
return self;
}
साथ ही, अगर आधार से पुनर init
में self
, तो self
पुन: असाइन किया जाता है (self = [super init];
)। बहुत अच्छा काम करता है।
आप super
के प्रारंभकर्ता के परिणाम के self
आवंटित करने के लिए असफल हो या आप nil
के लिए, तो आप एक झूलने को पकड़ने में किया जा सकता है/deallocated सूचक (EXC_BAD_ACCESS
) की जांच करने में विफल, और आप अपने ivars प्रारंभ नहीं हो सकता है यदि ठीक से (यदि EXC_BAD_ACCESS
का सामना नहीं किया गया था तो आप उन्हें प्रभावी रूप से किसी अन्य क्षेत्र में असाइन करेंगे)। और अधिक विस्तार में
दो मामलों:
विफल
- (id)init {
[super init];
if (self) {
// self was not reassigned. if super returned an object other
// than self, then our ivar would be freed, reused, or sitting
// in an autorelease pool, and the returned instance's ivar
// would not be assigned -- we wouldn't know the address.
ivar = 1;
}
return self;
}
विफल के लिए नहीं के बराबर
- (id)init {
self = [super init];
// super returned nil. ivar is an invalid region:
ivar = 1;
return self;
}
जाँच करने के लिए आत्म आवंटित करने के लिए और हाँ, मैं दोनों को देखा है इन।
तो वस्तु मौजूद नहीं कर सकते, इसका मतलब यह है सिस्टम स्मृति से बाहर गंभीरता से है, और यहां तक कि ऊपर पॉपिंग एक त्रुटि संदेश भी असंभव हो जाएगा?
बिलकुल नहीं। कई प्रारंभकर्ता nil
को "इस संदर्भ में नहीं कर सकते" कहने के लिए वापस लौटते हैं, या यदि कोई साधारण पैरामीटर त्रुटि है।
यह वास्तव में एक बहुत अच्छा सवाल है। मुझे पता है कि मैं कभी भी इस तरह के फ़ंक्शन के परिणाम से कुछ प्राप्त नहीं करता हूं, मुझे लगता है कि आवंटन/init काम करता है (जब तक कि कुछ ऐसा नहीं होता है जो त्रुटि और त्रुटि करता है, जो उस चीज़ का प्रतिनिधित्व करता है जिसमें असफल होने का मौका होता है)। वास्तव में एक बहुत ही दिलचस्प सवाल है। – RonLugge
संभावित डुप्लिकेट [उद्देश्य-सी में मुझे क्यों जांचना चाहिए कि क्या स्वयं = \ [सुपर इनिट \] शून्य नहीं है?] (Http://stackoverflow.com/questions/1287950/in-objective-c-why-should- i-check-if-self-super-init-is-not-nil) – omz