2010-02-27 13 views
16

क्या [anObject performSelector] को कॉल करने का कोई तरीका है; 2 से अधिक वस्तुओं के साथ? मुझे पता है कि आप कई तर्कों को पारित करने के लिए एक सरणी का उपयोग कर सकते हैं, लेकिन मैं सोच रहा था कि फ़ंक्शन को कॉल करने के लिए निम्न स्तर का तरीका था, मैंने पहले से ही तर्कों के एक nsarray के साथ एक सहायक फ़ंक्शन का उपयोग किए बिना 2 तर्कों के साथ परिभाषित किया है।प्रदर्शन 2 से अधिक वस्तुओं के साथ चयनकर्ता

उत्तर

48

या तो (1) NSInvocation या (2) का उपयोग सीधे objc_msgSend का उपयोग करें।

objc_msgSend(target, @selector(action:::), arg1, arg2, arg3); 

(नोट: सुनिश्चित करें सभी तर्कों id के हैं, अन्यथा तर्क को सही ढंग से नहीं भेजा जा सकता है बनाते हैं।)

+12

objc_msgSend उपयोग करते समय, आप की आवश्यकता होगी करने के लिए #import के अनुसार: http://stackoverflow.com/questions/4896510/how-to-import-nsobjcruntime-h -to-use-objc-msgsend –

+1

कि आखिरी नोट जो आपने सुनिश्चित किया है कि सभी तर्क टाइप आईडी के हैं .. क्या आप आगे समझा सकते हैं? या कृपया कुछ संसाधन प्रदान करें? मैं कोई नहीं ढूंढ सकता। –

14

आप NSObject वर्ग इस तरह का विस्तार कर सकते हैं:

- (id) performSelector: (SEL) selector withObject: (id) p1 
     withObject: (id) p2 withObject: (id) p3 
{ 
    NSMethodSignature *sig = [self methodSignatureForSelector:selector]; 
    if (!sig) 
     return nil; 

    NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig]; 
    [invo setTarget:self]; 
    [invo setSelector:selector]; 
    [invo setArgument:&p1 atIndex:2]; 
    [invo setArgument:&p2 atIndex:3]; 
    [invo setArgument:&p3 atIndex:4]; 
    [invo invoke]; 
    if (sig.methodReturnLength) { 
     id anObject; 
     [invo getReturnValue:&anObject]; 
     return anObject; 
    } 
    return nil; 
} 

(थ्री 20 प्रोजेक्ट से NSObjectAdditions देखें।) फिर आप उपरोक्त विधि को varargs और तर्कों के शून्य-समाप्त सरणी का उपयोग करने के लिए भी बढ़ा सकते हैं, लेकिन यह अधिक है।

0

एक अतिरिक्त विकल्प, जब आपको performSelector के साथ एकाधिक ऑब्जेक्ट भेजने की आवश्यकता होती है तो एक अतिरिक्त विकल्प है (यदि यह करने में आसान है) तो आप जिस पैरामीटर को कॉल करना चाहते हैं उसे NSDictionary ऑब्जेक्ट को एकाधिक पैरामीटर के बजाय ले जाने के लिए कॉल करना चाहते हैं, क्योंकि आप सक्षम होंगे आपको शब्दकोश के भीतर जितना चाहें उतना भेजने के लिए।

उदाहरण

के लिए मैं एक विधि यह जो 3 तर्क था के समान था और मैं इसे performSelector से कॉल करने के लिए की जरूरत -

-(void)getAllDetailsForObjectId:(NSString*)objId segment:(Segment*)segment inContext:(NSManagedObjectContext*)context{ 

मैं एक शब्दकोश का उपयोग स्टोर करने के लिए बनाने के लिए इस पद्धति को बदल कर तर्क

-(void)getAllDetailsForObject:(NSDictionary*)details{ 

इसलिए मैं विधि आसानी से

फोन करने में सक्षम था 10
[self performSelector:@selector(getAllDetailsForObject:) withObject:@{Your info stored within a dictionary}]; 

सोचा कि मैं इसे वैकल्पिक विकल्प के रूप में साझा करना चाहूंगा क्योंकि यह मेरे लिए काम करता है।

चीयर्स

संबंधित मुद्दे