2011-02-12 12 views
7

ऑब्जेक्टिव-सी की तरह निर्देशों है परिष्कृत मार्को या कोड जेनरेटर जैसी चीजों में से। क्या कोड-जनरेशन उद्देश्यों के लिए कस्टम निर्देश बनाना संभव है? कोरडाटा के लिए तरीकों का निर्माण करना एक संभावित उपयोग है।क्या उद्देश्य-सी में कस्टम निर्देश बनाना संभव है?</p> <ul> <li>@interface</li> <li>@implementation</li> <li>@end</li> <li>@protocol</li> <li>@property</li> <li>@synthesize</li> </ul> <p>मुझे लगता है कि:

मैं नहीं सोच रहा हूं, क्योंकि मैंने कभी इसके बारे में कुछ नहीं देखा है, लेकिन मेरी दुनिया दुनिया नहीं है।


फॉलोअप प्रश्न:

जोनाथन नीचे उल्लेख है कि यह अपनी खुद की पूर्वप्रक्रमक लिखने के लिए संभव है और इस बात का कैसे सवाल भीख माँगता। वर्तमान में, #Dfine SYMBOLIC_CONSTANT 102 संकलक पर फ़ाइलों को स्थानांतरित करने से पहले फ़ाइल में अक्षर 102 के साथ SYMBOLIC_CONSTANT वर्णों के सभी उदाहरणों को प्रतिस्थापित करेगा।

मुझे पता है कि एक्सकोड आप लक्ष्य निर्माण प्रक्रिया में "रन स्क्रिप्ट चरण" जोड़ सकते हैं। तो मैं अपने कस्टम प्रीप्रोसेस निर्देशों को '$ coredata' जैसे खोजने के लिए एक स्क्रिप्ट लिख सकता था और उसके बाद स्क्रिप्ट एक नई फाइल उत्पन्न करती है जिसमें पात्रों के साथ $ coredata कोड के कुछ वर्णों के साथ प्रतिस्थापित किया जाता है। लेकिन एक्सकोड की निर्माण प्रक्रिया के बारे में मैं जो समझता हूं उससे आप संकलित स्रोत चरण में परिवर्तित फ़ाइलों को फ़ीड नहीं कर सकते हैं। फ़ाइलों को आईडीई द्वारा निर्दिष्ट और लॉक किया गया है।

क्या किसी ने कुछ ऐसा किया है? मुझे पता है कि बाहरी निर्माण प्रणाली के साथ यह संभव है, लेकिन ईमानदार होने के लिए मैं उस स्तर की समझ में नहीं हूं। मैं बिल्ड और रन बटन के बारे में तकनीकी विवरण नहीं जानता हूं।

इस बीच में, मैं पढ़ एप्पल XCode प्रलेखन ...

प्रतिक्रिया के लिए धन्यवाद शुरू करेंगे!

+0

मैंने यह नहीं कहा कि यह दूरस्थ रूप से आसान होगा। हालांकि, '$ coredata 'जैसे कुछ वैध सी प्रीप्रोसेसर टोकन (' $ 'प्रतीक/मैक्रो नामों में उपयोग किया जा सकता है) है, इसलिए इसका उपयोग' # परिभाषित' कथन में किया जा सकता है। फिर भी, हालांकि - यदि आप हमें अपना लक्ष्य बताते हैं, तो हम समस्या के लिए एक आसान या बेहतर दृष्टिकोण सुझा सकते हैं। –

उत्तर

3

आपकी सोच सही है: यह आपके कोड में ऐसा करना असंभव है। @-डायरेक्टिव जोड़ने का एकमात्र तरीका संकलक के माध्यम से ही है। भले ही आप उस परेशानी के लिए गए, मैं लगभग गारंटी दे सकता हूं कि उनके लिए समर्थन को हाइलाइट करने वाला सिंटैक्स कहीं भी एक एक्सकोड कॉन्फ़िगरेशन फ़ाइल में हार्ड-कोड किया गया है।

ओह, और यदि आप प्री-प्रोसेसर मैक्रो के उपयोग पर विचार कर रहे थे, तो यह मेरी समझ है कि @ चरित्र प्री-प्रोसेसर मैक्रोज़ में अवैध है।

संपादित करें: मैंने एक परीक्षण चलाया, और मैं सही हूं। सी प्रीप्रोसेसर मैक्रो में @ वर्ण का उपयोग करना अवैध है। वे परिवर्तनीय नाम के समान नियम का पालन करते हैं।

+2

मैंने प्रीप्रोसेसर मैक्रो का उपयोग करने का उल्लेख नहीं किया। मेरा जवाब दोबारा पढ़ें। –

3

आपका उद्देश्य उद्देश्य-सी की सीमाओं के भीतर है? नहीं, क्योंकि आपके पास अपने नए कीवर्ड को पहचानने का कोई तरीका नहीं है। आप @whatever का पता लगाने के लिए एक प्रीप्रोसेसर लिख सकते हैं और इसे कोड में परिवर्तित कर सकते हैं, लेकिन यदि आप हमें बताते हैं कि आप विशेष रूप से क्या करना चाहते हैं, तो हम एक अधिक कुशल या इष्टतम दृष्टिकोण का सुझाव दे सकते हैं।

+1

सी प्रीप्रोसेसर मैक्रोज़ में @ चरित्र अवैध है। –

+0

प्रतिक्रिया के लिए धन्यवाद। आपने मुझे यह करने का विचार दिया कि यह कैसे करें। भूल गए कि कोड उत्पन्न करने के लिए आपको भाषा हुक की आवश्यकता नहीं है। – Tobias

+2

@ तिमाही: मैंने कहा * एक प्रीप्रोसेसर लिखें * नहीं * इनबिल्ट एक * का उपयोग करें। ऐसा नहीं है कि मैं उस कोड का उपयोग करना चाहता हूं जिसके लिए अपने स्वयं के कस्टम प्रीप्रोसेसर की आवश्यकता होती है। (ओह, रुको, मैं हर दिन उद्देश्य-सी का उपयोग करता हूं ...) –

0

यह संभव नहीं है। ये उद्देश्य-सी भाषा में बनाए गए कीवर्ड हैं। सिर्फ इसलिए कि उनके सामने @ है, जो उन्हें अन्य कीवर्ड से अलग नहीं बनाता है।

5

जबकि स्वीकृत उत्तर सही है, इस तरह की समस्या के लिए आंशिक हैकी समाधान है, जो libextobjc लाइब्रेरी गोद लेता है। this code पर विचार करें, आप की तरह वहाँ निम्नलिखित परिभाषा मिलेगा:

id foo = [[NSObject alloc] init]; 
id bar = [[NSObject alloc] init]; 

@weakify(foo, bar); 

पुस्तकालय के लेखक यह बताते हैं here:

#define weakify(...) \ 
    try {} @finally {} \ 
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__) 

इस तरह की परिभाषा निम्नलिखित रूप में weakify कीवर्ड का उपयोग की अनुमति देता है

चूंकि मैक्रोज़ का उपयोग @ प्री के साथ किया जाना है उन्हें (जैसे @strongify (स्वयं);), कोशिश करें {} प्रतीक को सूखता है, इसलिए यह वाक्यविन्यास त्रुटियों का कारण नहीं है।


अपडेट किया गया बाद में

From now on libextobjc @autoreleasepool का उपयोग करता है "प्रतीक सोख करने के लिए"।

+0

* सख्त, भयानक हैक-ओरी के साथ महान स्पष्टीकरण – TheCodingArt

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