2012-01-23 12 views
5

È sicuro utilizzare le classi definite nel proprio progetto all'interno delle funzioni __attribute __ ((costruttore)? Il runtime obiettivo-C ha avuto la possibilità di fare ciò che è necessario fare con le classi quando vengono chiamate le funzioni __attribute __ ((costruttore)? Oppure sto fraintendendo il modo in cui il runtime carica le classi e non c'è differenza tra la classe della libreria e la tua in questo contesto?classi di funzioni __attribute __ ((costruttore) sicure

+0

Cosa hai provato? La documentazione GCC dice che questo attributo non è attualmente supportato per Objective-C (http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html), e la documentazione di Clang sembra essere silenziosa sul problema. – CRD

+1

@CRD I costruttori di immagini si comportano come previsto utilizzando entrambi i compilatori distribuiti con Xcode. – justin

+0

@Justin - così tanto per la documentazione ;-) Sembra che dovresti pubblicare il tuo commento come risposta. Nathan, perché vuoi usare questo attributo piuttosto che '+ initialize', che viene eseguito prima dell'uso di una classe? – CRD

risposta

7

Ti suggerisco di utilizzare + initialize o + load anziché l'attributo, ma questa è la mia preferenza.

Il metodo + load di una classe viene chiamato quando la classe viene caricata dal runtime.

Il metodo + initialize di una classe viene chiamato prima di qualsiasi altro metodo nella classe.

Dalla documentazione per load:

In Mac OS X v10.5, l'ordine di inizializzazione è la seguente:

  1. Tutti initializers in ogni quadro si collega a.
  2. Tutto + caricare i metodi nell'immagine.
  3. Tutti gli inizializzatori statici C++ e C/C++ attributo (costruttore) funzioni nell'immagine.
  4. Tutti gli inizializzatori in framework che si collegano all'utente.

Inoltre:

  • metodo load + di una classe viene chiamato dopo che tutti i metodi di carico + sue superclassi.
  • Un metodo di carico di categoria + viene chiamato dopo il metodo di caricamento + della classe.

In un metodo di caricamento +, è possibile quindi inviare messaggi in modo sicuro ad altre classi non correlate dalla stessa immagine, ma eventuali metodi di caricamento + su tali classi potrebbero non essere ancora stati eseguiti.

Ciò rende evidente qualsiasi metodo attribuito o + load eseguito dopo l'inizializzazione del runtime. E come + load è un metodo sulla tua classe ed è eseguito prima di qualsiasi metodo attribuito prima che il runtime abbia impostato la tua classe.

+0

+1 buona scoperta, CRD! – justin

0

Queste non sono funzioni, sono solo notazioni degli attributi del compilatore. Non cambieranno affatto il codice generato.

+0

è usato per dire "chiama questa funzione quando l'immagine è caricata" ed è supportato. la domanda riguarda l'ordine di inizializzazione. pensa in questo modo: * Ho un framework che ha una funzione init e alcune classi objc. posso usare tranquillamente i tipi objc esportati dal framework all'interno della funzione di costruzione del framework? saranno caricati nel runtime da quel punto? * – justin

Problemi correlati