2011-02-12 10 views
7

Objective-C ha direttive come:È possibile creare direttive personalizzate in Objective-C?

  • @interface
  • @implementation
  • @end
  • @protocol
  • @property
  • @synthesize

penso di queste cose come sofisticati marco o generatori di codice. È possibile creare direttive personalizzate per scopi di generazione del codice? Un possibile utilizzo è la generazione di metodi per CoreData.

Non ci sto pensando, perché non ne ho mai visto nulla, ma il mio mondo non è il mondo.


Domanda ollowup:

Jonathan detto di sotto che è possibile scrivere il proprio preprocessore e questo pone la questione di come. Attualmente, #define SYMBOLIC_CONSTANT 102 sostituirà tutte le istanze dei caratteri SYMBOLIC_CONSTANT con i caratteri 102 nel file prima che i file si spostino sul compilatore.

Lo so che XCode è possibile aggiungere una "fase Script di esecuzione" a un processo di creazione di Target. Quindi potrei scrivere uno script per trovare le mie direttive preprocess personalizzate come '$ coredata' e poi avere lo script generare un nuovo file che con i caratteri $ coredata sostituito con alcuni caratteri di codice. Ma da quello che capisco del processo di compilazione di XCode non puoi alimentare file alterati nella fase Fonti del compilatore. I file sono specificati e bloccati dall'IDE.

Qualcuno ha fatto qualcosa di simile? So che è possibile con un sistema di build esterno, ma ad essere sincero non sono a quel livello di comprensione. Non conosco i dettagli tecnici di ciò che fa il pulsante Crea ed esegui.

Nel frattempo, io inizio a leggere la documentazione di Apple XCode ...

Grazie per le risposte!

+0

Non ho detto che sarebbe stato facile da remoto. Tuttavia, qualcosa come '$ coredata' è un token di preprocessore C valido (' $ 'può essere usato nei nomi di simboli/macro), quindi può essere usato in un'istruzione' # define'. Anche in questo caso, se ci dici il tuo obiettivo, potremmo essere in grado di suggerire un approccio più semplice o migliore al problema. –

risposta

3

Il tuo modo di pensare è corretto: è impossibile farlo nel tuo codice. L'unico modo per aggiungere altre @ -direttive è tramite il compilatore stesso. Anche se sei andato incontro a tutti quei problemi, posso quasi garantire che il supporto per l'evidenziazione della sintassi per loro sia hard-coded in un file di configurazione Xcode da qualche parte.

Oh, e se si pensava di utilizzare una macro pre-processore, è a mia conoscenza che il carattere @ è illegale nelle macro pre-processore.

Modifica: ho eseguito un test e ho ragione. L'utilizzo del carattere @ in una macro del preprocessore C è illegale. Seguono la stessa regola dei nomi di variabili.

+2

Non ho menzionato l'uso di una macro per il preprocessore. Rileggere la mia risposta –

3

Intendi entro i limiti dell'Obiettivo-C? No, in quanto non ha modo di riconoscere le tue nuove parole chiave. Potresti scrivere un preprocessore per rilevare @whatever e convertirlo in codice, ma se ci dici cosa vuoi fare in particolare, potremmo essere in grado di suggerire un approccio più efficiente o ottimale.

+1

Il carattere @ è illegale nelle macro del preprocessore C. –

+0

Grazie per la risposta. Mi hai dato l'idea di come farlo. Hai dimenticato di non aver bisogno di un hook per la lingua per generare codice. – Tobias

+2

@Carter: ho detto * di scrivere un preprocessore * non * utilizzare quello incorporato *. Non che mi piacerebbe usare il codice che richiede un proprio preprocessore personalizzato. (Oh, aspetta, uso Objective-C ogni giorno ...) –

0

Non è possibile. Queste sono parole chiave integrate nel linguaggio Objective-C. Solo perché c'è un @ davanti a loro non li rende diversi dalle altre parole chiave.

5

Sebbene la risposta accettata sia corretta, esiste una soluzione hacky parziale a questo tipo di problema, che adotta la libreria libextobjc. Considerate this code, si trovano le definizioni come il seguente ci:

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

Tale definizione permette di utilizzare weakify parola chiave nella forma seguente:

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

@weakify(foo, bar); 

L'autore di libreria lo spiega here:

Poiché i macro devono essere utilizzati con un pre cedendoli a (come @strongify (self);), il try {} assorbe il simbolo in modo che non sia causare errori di sintassi.


Aggiornato tardi

From now on libextobjc utilizza @autoreleasepool a "prendere il simbolo".

+0

* sospiro, ottima spiegazione con orribile hack-ory – TheCodingArt

Problemi correlati