Sono sicuro che otterrò 20 persone che dicono "perché vorresti farlo comunque" ... ma, in ogni caso, farò la mia domanda perché è in qualche modo accademico.Utilizzo di macro C per creare un codice in stile C che mappa le chiamate ai messaggi Objective-C?
Vorrei utilizzare le macro C per ridefinire [ClassName new]
in qualcosa come: new(ClassName)
e mi chiedo come farlo. Non mi sento molto a mio agio con i macro C per cominciare (lo so - imbarazzante - dovrei esserlo) - e non sono assolutamente a mio agio nel mescolarli con il mio codice Objective-C. Così, con la domanda ...
In primo luogo, essendo è una cosa preprocessore, posso fare una semplice sostituzione, come ad esempio:
#define new(x) [x new]
o, per qualsiasi motivo, ho bisogno di scendere fino a l'Objective-C runtime, e fare qualcosa di più simile a:
#define new(x) objc_msgSend(class_createInstance(x, 0), sel_registerName("init"))
Quali sono le cadute di fare qualcosa di simile?
Questo tipo di cose viene usato spesso da altri, oppure qualcuno lo guarda e dice "che diavolo ci fai lì"? (E dovrei preoccuparmi)
Grazie
EDIT:
Mi venne in mente dopo questo distacco, che ho, infatti, vedere questo tipo di cose prima - nella cartella lib Three20, dove fanno cose del genere:
#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
#define TT_INVALIDATE_TIMER(__TIMER) { [__TIMER invalidate]; __TIMER = nil; }
// Release a CoreFoundation object safely.
#define TT_RELEASE_CF_SAFELY(__REF) { if (nil != (__REF)) { CFRelease(__REF); __REF = nil; } }
Quindi probabilmente la mia domanda diventa semplicemente; Quali sono le carenze di questo, ed è una pratica relativamente accettata, o qualcosa che mi farà entrare più problemi di quanto valga la pena?
Riguardo a come verrebbe ricevuto ... beh, i programmatori C [non mi piace '#define begin {'] (http://stackoverflow.com/questions/652788/what-is-the-worst-real -world-macros-pre-processor-abuse-youve-ever-come-across/652820 # 652820) (e ci sono altri esempi in quel thread), quindi probabilmente non piacerà neanche a questo. E ho simpatia. – delnan
@delnan - Grazie per il link! Mi sento come se il mio esempio specifico fosse più in linea con l'intento dei macro di alcuni degli esempi citati in quel thread ... e ho visto macro usate in questo modo per il rilascio (vedi Three20 che usa quel 'pazzo TT_RELEASE_SAFELY' o qualunque cosa si chiami). – Steve