मैं किसी ऑब्जेक्ट पर एक विधि को कॉल करने और sender को तर्क के रूप में भेजने के लिए एनएसआईएनवोकेशन का उपयोग करने का प्रयास कर रहा हूं। नीचे दिया गया कोड mthod को कॉल करता है, लेकिन ऐसा लगता है कि ऑब्जेक्ट mthod में जा रहा है, वास्तव में सेल्फ़ ऑब्जेक्ट नहीं है

- (void)setTarget:(id)taret withAction:(SEL)selector
{
    NSMethodSignature *methodSignature = [target methodSignatureForSelector:action];
    _invocation = [[NSInvocation invocationWithMethodSignature:methodSignature] retain];

    _invocation.target = target;
    _invocation.selector = action;
    [_invocation setArgument:self atIndex:2];
}

- (void)callTargetWithSender
{
   [_invocation invoke];
}
1
aryaxt 19 जुलाई 2011, 06:52
2
कृपया अपने प्रश्नों को पूरी तरह से दोबारा न लिखें। यह बाद में भ्रम पैदा करता है जब लोग खोज कर रहे होते हैं और वे पाते हैं कि उत्तर अब प्रश्न से मेल नहीं खाते हैं। यदि आपका कोई नया प्रश्न है, तो आपको पहले प्रश्न को समाप्त करना चाहिए और फिर नया प्रश्न पूछना चाहिए।
 – 
Rob Napier
19 जुलाई 2011, 19:00

3 जवाब

सबसे बढ़िया उत्तर

डिस्ट्रिब्यूटेड ऑब्जेक्ट प्रोग्रामिंग गाइड में "एनएसआईएनवोकेशन का उपयोग करना" देखें। .


नए प्रश्न के आधार पर संपादित करें *

मुझे लगता है कि ऊपर इस तरह कहा जाएगा:

[foo setTarget:target withAction:@selector(doSomething:)];

उस स्थिति में, अंतिम संदेश होगा:

[target doSomething:foo];
2
Rob Napier 19 जुलाई 2011, 19:02

[आह्वान सेटअर्ग्यूमेंट:(__bridge void *)(self) atIndex:2];

2
user3176858 9 जिंदा 2014, 13:27

आप सिर्फ उपयोग क्यों नहीं करते

   [target performSelector:selector withObject:self];

??? जब selector, @selector(foo:) हो, तो यह बराबर होता है

   [target foo:self];

मेरी राय में, आपकी स्थिति में NSInvocation एक ओवरकिल है।

1
Yuji 19 जुलाई 2011, 08:39
क्योंकि प्रदर्शन चयनकर्ता करने के लिए मुझे चयनकर्ता और लक्ष्य दोनों को स्टोर करने की आवश्यकता है और मेरे पास यहां जिम्मेदार होने के लिए 1 ऑब्जेक्ट (एनएसआईएनवोकेशन) है। मैं किसी अन्य वस्तु में विधि के बारे में जानकारी संग्रहीत करने के लिए एनएसआईएनवोकेशन का उपयोग कर रहा हूं ताकि जब भी मैं चाहूं इसे कॉल कर सकूं।
 – 
aryaxt
19 जुलाई 2011, 08:41
1
इसके लिए NSInvocation का उपयोग करने में कुछ भी गलत नहीं है। हालांकि, ध्यान दें कि NSInvocation बनाना बहुत महंगा है। मेरे परीक्षणों में विधि कॉल करने के रूप में लगभग 500x धीमा। वे आह्वान करने के लिए महंगे नहीं हैं, बस बनाएं। ज्यादातर मामलों में यह कोई समस्या नहीं है, लेकिन यह याद रखने योग्य है यदि आप उन्हें बहुत बार बनाते हैं। हालाँकि, आपका उपयोग मामला ठीक है, और यही NSInvocation के लिए डिज़ाइन किया गया है। NSInvocation, performSelector:... के विपरीत, मनमाने ढंग से कई मापदंडों को संभाल सकता है
 – 
Rob Napier
19 जुलाई 2011, 18:57