आप शून्य पर एक संदेश भेज सकते हैं, लेकिन आप शून्य के आवृत्ति चर तक नहीं पहुंच सकते हैं। आपको EXC_BAD_ACCESS
अपवाद मिलेगा।
@implementation MyObject {
int instanceVariable;
}
- (id)init {
self = [super init];
instanceVariable = 7;
return self;
}
अगर [super init]
रिटर्न इस उदाहरण में शून्य क्या होता है:
एक वर्ग उदाहरण चर है कि विचार करें? आप एक शून्य सूचक से instanceVariable
तक पहुंचने का प्रयास करेंगे और आपको अपवाद मिलेगा।
भले ही आप किसी भी आवृत्ति चर का उपयोग नहीं कर रहे हैं, फिर भी यदि आप self == nil
की जांच नहीं करते हैं तो अन्य चीजें निश्चित रूप से गलत हो सकती हैं। आप malloc
- आवंटित स्मृति या फ़ाइल हैंडल को आसानी से रिसाव कर सकते हैं, या खुद को ऐसी विधि से गुजर सकते हैं जो शून्य की अपेक्षा नहीं कर रहा है।
अन्य उत्तरों का दावा है कि यदि आप शून्य की जांच नहीं करते हैं तो आप वस्तुओं को रिसाव कर सकते हैं। उदाहरण के लिए:
@implementation MyObject
@synthesize someProperty; // assume it's an NSObject *
- (id)init {
self = [super init];
[self setSomeProperty:[[NSObject alloc] init]];
return self;
}
यह एआरसी के तहत लीक नहीं होगा, भले ही self
नहीं के बराबर है। मैन्युअल संदर्भ गिनती (एमआरसी) के तहत, यह उदाहरण रिसाव करेगा कि self
शून्य है या नहीं, क्योंकि [NSObject alloc]
से +1 को बनाए रखने के लिए कुछ भी नहीं है।
- (id)init {
self = [super init];
[self setSomeProperty:[[[NSObject alloc] init] autorelease]];
}
या इस:
- (id)init {
self = [super init];
NSObject *object = [[NSObject alloc] init];
[self setSomeProperty:object];
[object release];
return self;
}
न तो उन लोगों में से रिसाव हो जाएगा कि क्या self
नहीं के बराबर है या नहीं
एमआरसी के तहत यह करने के लिए उचित तरीके से इस है।
- (id)init {
self = [super init];
_someProperty = [[NSObject alloc] init];
return self;
}
स्रोत
2012-08-17 07:22:17
यह एक संकेत है - सी में अपवाद नहीं हैं। –
+1 हालांकि, महान जवाब। –
यह एक सीपीयू अपवाद है, सी ++ अपवाद नहीं। '/ Usr/include/mach/upgrade_types.h' देखें। –