अब मैं पॉइंटर से पॉइंटर द्वारा उलझन में हूं, भले ही मैंने Why does NSError need double indirection? (pointer to a pointer) और NSError * vs NSError ** और बहुत कुछ पढ़ा है।एनएसईआरआर/एनएसओब्जेक्ट पॉइंटर गुजरने वाले व्यवहार को समझ नहीं सकता
मैंने कुछ सोच की है और अभी भी कुछ प्रश्न हैं।
यहाँ मैं यह लिखा:
- (id)doSomethingWithObj:(NSObject *)obj error:(NSError *__autoreleasing *)error
{
NSLog(@"inside error address: %p", error);
id object = obj;
if (object != nil)
{
return object;
}
else
{
NSError *tmp = [NSError errorWithDomain:@"after" code:0 userInfo:nil];
*error = tmp;
return nil;
}
}
लेकिन मैंने पाया कि दो लॉगिंग पते अलग-अलग हैं:
NSError *error = [NSError errorWithDomain:@"before" code:0 userInfo:nil];
NSLog(@"outside error address: %p", &error];
[self doSomethingWithObj:nil error:&error];
आदेश ऊपर NSError
विधि का परीक्षण करने के लिए, मैं इस लिखा था। ऐसा क्यों है?
2016-08-19 19:00:16.582 Test[4548:339654] outside error address: 0x7fff5b3e6a58
2016-08-19 19:00:16.583 Test[4548:339654] inside error address: 0x7fff5b3e6a50
क्या वे समान नहीं होंगे क्योंकि यह एक साधारण मूल्य प्रति था? यदि वे अलग होना चाहिए, तो पॉइंटर को पॉइंटर को NSError
इंस्टेंस पर इंगित करने का अंत कैसे हो सकता है?
संकलक पॉइंटर के साथ पॉइंटर के साथ कुछ कर रहा है, शायद एआरसी से निपटने के लिए। ऑब्जेक्टिव-सी पॉइंटर्स के नवीनतम संस्करण में बहुत अधिक स्मारक प्राप्त हुए, इसलिए एक साधारण मूल्य प्रतिलिपि के रूप में उपयोग किया जाने वाला यह अब इतना आसान नहीं हो सकता है। आप इस प्रश्न को इस तरह से फिर से वाक्यांशित करना चाहेंगे कि 'एनएसईआरआरआर' के साथ कुछ भी नहीं है - कहें, "विधि पैरामीटर के रूप में पारित होने पर पॉइंटर परिवर्तन के सूचक" या कुछ समान है। – dasblinkenlight
लेकिन एनएसईआरर * __autoreleasing * एक पैटर्न है जो हर जगह प्रयोग किया जाता है और यह संकलक द्वारा अलग-अलग पहचाना और संभाला जाता है। – gnasher729