2013-09-03 7 views
5

मैं एक हेडर फाइल है कि एक वर्ग इंटरफेस को परिभाषित करता है:क्या एक्सकोड में प्रति लक्ष्य एकाधिक कार्यान्वयन करना ठीक है?

// MyClass.h - included in all targets 
// 
@interface MyClass 
+ (void) doThing; 
@end 

और मैं दो अलग अलग कार्यान्वयन फ़ाइलें - लक्ष्य प्रति एक।

// MyClass+targetA.m - Only included in targetA 
// 
@implementation MyClass 
+ (void) doThing { NSLog(@"targetA"); } 
@end 


// MyClass+targetB.m - Only included in targetB 
// 
@implementation MyClass 
+ (void) doThing { NSLog(@"targetB"); } 
@end 
  • वहाँ इस दृष्टिकोण के साथ किसी भी मुद्दे हैं?
  • क्या प्रत्येक लक्ष्य के व्यवहार को अनुकूलित करने के लिए कोई बेहतर या आसान तरीका है?

विधि MyClass एक ऐप की उपस्थिति को थीम करने के लिए होगा। MyClass पर कई विधियां और कई लक्ष्य

+2

क्या ये दो कार्यान्वयन इतने जंगली रूप से अलग हैं कि वे विभिन्न स्रोत फ़ाइलों में उचित हैं? यदि नहीं, तो लक्ष्य-विशिष्ट प्रीप्रोसेसर परिभाषा के आधार पर #ifdef बेहतर विकल्प हो सकता है। यदि आप दो फाइलें रखने का फैसला करते हैं, तो भी मैं उनका नाम बदलने का सुझाव देता हूं। मैंने एक्सकोड को भ्रमित कर दिया है जब दो फाइलों का एक ही नाम है (ठीक है, लेकिन कभी-कभी संपादक में गलत प्रस्तुत करना)। – mah

+0

@mah - दिलचस्प! आपके प्रतिक्रिया के लिए धन्येवाद। मैंने प्रीप्रोसेसर का उपयोग करने के बावजूद परिभाषित किया था क्योंकि मैंने उन्हें अतीत में भी इस्तेमाल किया था। कार्यान्वयन विभिन्न ग्राहकों के लिए एक ऐप थीम करने के लिए है, इसलिए कार्यान्वयन के बीच काफी विविधता है। नाम बदलने के बारे में महान युक्ति - हालांकि यह संभव नहीं था। – Robert

+0

कक्षा का नाम और स्रोत फ़ाइल नाम के बीच कोई संबंध नहीं है, इसलिए निश्चित रूप से संभव है - लेकिन उन्हें सही तरीके से नाम देने के लिए सबसे अच्छा है ... जैसे MyClass_client1.m, MyClass_client2.m, आदि – mah

उत्तर

1

हां ठीक काम करेगा, और मैंने एक समान दृष्टिकोण लिया है, सिवाय इसके कि मैंने सशर्त संकलन का उपयोग किया है, एक लक्ष्य के साथ निजी कार्यक्षमता का खुलासा करने और सार्वजनिक कार्यक्षमता को उजागर करने वाला एक और लक्ष्य, लेकिन सभी लक्ष्य स्रोत फ़ाइलों के एक ही सेट को साझा करते हैं।

हालांकि हमारे दोनों दृष्टिकोणों के परिणाम समान हैं।

+0

आपके उत्तर के लिए धन्यवाद ! मैं समझ नहीं पा रहा हूं कि "निजी कार्यक्षमता को उजागर करने का लक्ष्य और सार्वजनिक कार्यक्षमता को उजागर करने वाला दूसरा लक्ष्य" क्या है। यह दिलचस्प लगता है, क्या आप इसे थोड़ा समझा सकते हैं? – Robert

+0

@ रॉबर्ट यह बस इतना है कि मैं सीमित कार्यक्षमता वाले लोगों को एक स्थिर पुस्तकालय प्रदान करना चाहता हूं, इसलिए मैं निजी और सार्वजनिक निर्माण में क्या नियंत्रण करता हूं इसे नियंत्रित करने के लिए संकलन के दौरान निरंतर उपयोग करता हूं। – trojanfoe

1

तो मैं वास्तव में को अपने कस्टम ध्वज के साथ TARGET_FREE जैसे कस्टम सेटिंग्स के साथ सेट करना पसंद करता हूं। और फिर स्रोत में मैं कुछ लिख सकता हूं:

@implementation MyClass 
+ (void) doThing { 

#ifdef TARGET_FREE 
    // Code for one target 
#else 
    // Code for another 
#endif 

} 
@end 
+0

हां मैंने अतीत में इसका इस्तेमाल किया था और यह अच्छी तरह से काम करता है। मुद्दा 'MyClass' की जटिलता है। इसमें इसके बारे में 20 तरीके हैं (यह विभिन्न ग्राहकों के लिए एक टेम्पलेट ऐप थीम करने के लिए है)। मैं कोड को अधिक जटिल होने के रूप में देखता हूं क्योंकि इस तरह लागू होने पर लक्ष्य और विधियों की संख्या बढ़ जाती है। – Robert

+0

ठीक है। समझा। तो ऐसा न हो कि यह संकलित और काम करेगा जैसा इसे करना चाहिए। हो सकता है कि आप संबंधित कोड संपादित करते समय एक्सकोड में कुछ नेविगेशन या कोड भावना समस्याओं का सामना कर सकें लेकिन सुनिश्चित नहीं हैं। – Skie

+0

हां ने हेडर से स्रोत तक शॉर्टकट नेविगेशन की पुष्टि की है। मैंने ट्रोजनफो की सलाह ली और प्रत्येक .m फ़ाइल का नाम बदल दिया। मुझे लगता है कि मैं उस – Robert

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