2010-04-16 9 views
22

optimizing Objective C programs के बारे में मेरा एक अन्य प्रश्न निम्नलिखित को प्रेरित करता है: क्या किसी के पास एसईएल और आईएमपी का उपयोग करके एक छोटा सा उदाहरण है जब मोड में इनपुट के लिए दो (या अधिक) पूर्णांक होते हैं?उद्देश्य-सी और एसईएल/आईएमपी

+1

क्या आप अधिक जानकारी दे सकते हैं? मुझे यकीन नहीं है कि एसईएल और आईएमपी द्वारा आपका क्या मतलब है। – drekka

+0

हाँ, क्या, बिल्कुल, क्या आप करना चाहते हैं? –

उत्तर

45

वर्तमान आईएमपी (आईएमपी के अवलोकन के साथ) प्राप्त करने के लिए यहां good tutorial है। आईएमपी और sels का एक बहुत ही बुनियादी उदाहरण है:

- (void)methodWithInt:(int)firstInt andInt:(int)secondInt { NSLog(@"%d", firstInt + secondInt); } 

SEL theSelector = @selector(methodWithInt:andInt:); 
IMP theImplementation = [self methodForSelector:theSelector]; 
//note that if the method doesn't return void, you have to explicitly typecast the IMP, e.g. int(* foo)(id, SEL, int, int) = ... 

फिर आप तो जैसे छोटा सा भूत आह्वान सकता:

theImplementation(self, theSelector, 3, 5); 

आम तौर पर जब तक आप गंभीर वूडू कर रहे हैं आईएमपी जरूरत के लिए कोई कारण नहीं है - है क्या आप कुछ विशिष्ट करना चाहते हैं?

+3

@eman: आपको उस वापसी को कास्ट करने की आवश्यकता है: शून्य (* कार्यान्वयन) (आईडी, एसईएल, int, int) = (शून्य (*) (आईडी, एसईएल, int, int)) [स्वयं विधिफॉर चयनकर्ता: चयनकर्ता]; –

+0

@ जेसन कोको- अगर मैं गलत हूं, तो मुझे सही करें, लेकिन मुझे लगता है कि आईएमपी टाइप किया गया है (आईडी, एसईएल, ...), इसलिए इससे कोई फर्क नहीं पड़ता (हालांकि यह टाइपएफ़ नहीं है, लेकिन अगर आपको टाइपफैटी की ज़रूरत है, आपको शायद आईएमपी का उपयोग नहीं करना चाहिए)। – shosti

+3

आप सही हैं, क्योंकि यह विधि शून्य है, यह ठीक है, लेकिन आपको कई अन्य मामलों में त्रुटियां मिलेंगी। आपको/जरूरत/कास्ट करना संभवतः बहुत मजबूत था, आपको हमेशा/सही होना चाहिए/शायद यह सही है;) - लेकिन यह सवाल स्वयं ही दिया गया है, मेरा अनुमान है कि ओपी शायद/आईएमपी का उपयोग नहीं कर रहा/चाहिए। –

1

अब मैं एमन को यह काम करने के लिए धन्यवाद है, मैं अभी तक एक और उदाहरण जोड़ सकते हैं:

SEL [email protected](getRankOf:::::::);

IMP rankingMethod=[eval methodForSelector:cardSelector];

rankingMethod(eval, cardSelector, 0, 1, 2, 3, 4, 5, 6);

मैं उपयोगी कुछ भी करने के लिए इस की जरूरत नहीं है, मुझे बस अपनी जिज्ञासा को पूरा करने की ज़रूरत है! फिर से धन्यवाद।

+0

उद्देश्य-सी को अनुकूलित करने पर एक और अच्छा लिंक है http://www.mulle-kybernetik.com/artikel/Optimization/opti-3-imp-deluxe.html – SK9

1

यहां एक और संभावित विकल्प है। यह दुर्घटना से बचाता है लेकिन स्टबिंग काम नहीं करता है।

- (void)setUp 
{ 
    [super setUp]; 

    [self [email protected](firstName) toClass:[User class]]; 
    [self [email protected](lastName) toClass:[User class]]; 
} 

- (void)addSelector:(SEL)selector toClass:(Class)class 
{ 
    NSString *uniqueName = [NSString stringWithFormat:@"%@-%@", NSStringFromClass(class), NSStringFromSelector(selector)]; 
    SEL sel = sel_registerName([uniqueName UTF8String]); 
    IMP theImplementation = [class methodForSelector:sel]; 
    class_addMethod(class, selector, theImplementation, "[email protected]:@"); 
} 
संबंधित मुद्दे