NSObject
दस्तावेज़ीकरण पर एक नज़र डालें।
[parent performSelector:sel withObject:[NSNumber numberWithInt:i]];
(ध्यान दें कि यह विधि वास्तव में NSObject
protocol दस्तावेज में सूचीबद्ध है): इस मामले में। चूंकि -[NSObject performSelector:withObject:]
एक वस्तु तर्क की आवश्यकता है, आप की तरह
-(void)myMethodForNumber:(NSNumber*)number {
[self myMethod:[number intValue]];
}
NSNumber
Unbox करने के लिए माता-पिता की कक्षा में एक आवरण लिखने के लिए होगा।
तुम सच में एक विधि है कि गैर वस्तु तर्क सीधे लेता आह्वान करने के लिए चाहते हैं (उदाहरण के लिए, आप कॉल प्राप्त करने वाला स्रोत का नियंत्रण नहीं है और एक वर्ग को जोड़ने के लिए नहीं करना चाहते हैं), तो आपको NSInvocation
उपयोग कर सकते हैं:
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[parent methodSignatureForSelector:sel]];
[inv setSelector:sel];
[inv setTarget:parent];
[inv setArgument:&i atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv invoke];
एक तरफ ध्यान दें, आपकी विधि init
विधि की तरह दिखती है, लेकिन उद्देश्य-सी के लिए सही प्रारंभकर्ता पैटर्न का पालन नहीं करती है। आपको सुपर-क्लास प्रारंभकर्ता को कॉल करने की आवश्यकता है, और आपको उस कॉल से nil
परिणाम के लिए परीक्षण करने की आवश्यकता है और आपको प्रारंभकर्ता विधि से स्वयं को वापस करना होगा।
-(id)myInitMethod {
self = [super init];
if(self != nil) {
//perform initialization of self
}
return self;
}
आपका पद्धति (यदि यह एक init विधि है) तो ऐसा दिखाई देगा:: सभी मामलों में, अपने ऑब्जेक्टिव-सी प्रारंभकर्ता तरीकों की तरह दिखना चाहिए
-(id) init: (SEL)sel owner:(NSObject*) parent
{
self = [super init];
if(self != nil) {
int i = 10;
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[parent methodSignatureForSelector:sel]];
[inv setSelector:sel];
[inv setTarget:parent];
[inv setArgument:&i atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv invoke];
}
return self;
}
शैलीगत अधिक ऑब्जेक्टिव-सी होने के लिए, मैं शुरुआती -(id)initWithSelector:owner:
का नाम बदलूंगा।
धन्यवाद, यह ऊपर और परे चला जाता है। मैंने अनुमान लगाया था कि मुझे एनएसआईएनवोकेशन का उपयोग करने की आवश्यकता हो सकती है लेकिन यह सुनिश्चित नहीं था। बहुत बढ़िया जवाब। – madmik3
एक तरफ के रूप में, भले ही आपके पास कैली पर नियंत्रण न हो, फिर भी आप उस वर्ग पर किसी श्रेणी का उपयोग करके एक रैपर विधि लिख सकते हैं ताकि ऑब्जेक्ट को आदिम प्रकार में अनबॉक्स कर सकें। –
अच्छा बिंदु, एड। –