2012-01-03 14 views
15

Diciamo che ho un controller di visualizzazione o un controller di finestra, che è (come al solito) il "Proprietario del file" in un file XIB corrispondente.Variabili di istanza IBOutlet nei file di implementazione (.m)

È (come tutti sapete) molto comune avere IBOutlet s nella classe controller che è quindi possibile connettersi in XIB utilizzando Interface Builder.

Fino ad ora, ho creato variabili di istanza IBOutlet nei file di interfaccia (.h). Ma (come tutti sapete) gli IBOutlet s sono molto spesso un meccanismo privato della classe controller; gli estranei non dovrebbero nemmeno saperlo.

Questo è il motivo per cui ora, poiché Objective-C ha recentemente iniziato a offrire la possibilità di farlo, voglio mettere tutti i miei file IBOutlet nei miei file di implementazione (.m).

Ho provato a farlo e sembra funzionare correttamente. Le mie domande sono queste: Perché funziona? Ho avuto l'impressione che Interface Builder potesse solo visualizzare i file di intestazione della classe, non dare un'occhiata ai loro file di implementazione. Ho sbagliato? Come mai Interface Builder può "vedere dentro" i file di implementazione? Potrebbe essere potenzialmente pericoloso inserire le variabili di istanza IBOutlet nei file di implementazione?

+1

Si noti che questo è possibile solo quando si utilizza il runtime moderno su Mac, che significa solo 64 bit. Il runtime classico richiede che tutti gli ivars vengano dichiarati nell'intestazione. –

risposta

12

Da Xcode 4 User Guide

Nota: A causa Xcode 4 analizza sia i file header e implementazione file per l'indicizzazione, è possibile definire le azioni e le prese in implementazione (.m) file senza bisogno di metterli in header ed è possibile effettuare connessioni direttamente dal file pennino al file di implementazione . Pertanto, non è necessario esporre parti di l'interfaccia o le azioni ai client che potrebbero utilizzare le classi.

E per Potrebbe essere potenzialmente pericoloso inserire le variabili di istanza IBOutlet nei file di implementazione?

Sì, ma non tanto quanto è possibile accedere a qualsiasi metodo dichiarato a causa della mancanza di access-scope in fase di esecuzione. Anche se il metodo non è accessibile, la risoluzione viene eseguita in fase di esecuzione e al metodo non sono associate informazioni sull'accesso. Che avrebbe potuto essere implementato, ma Objective-C manca di private, protected e così via come in C++ o Java. Si noti che l'implementazione di un tale comportamento sarebbe ancora più lenta in fase di esecuzione.

+1

Puoi spiegare perché l'utilizzo di ivar IBOutlet nei file di implementazione è potenzialmente pericoloso? –

+0

Perché significa che alcuni del tuo codice accedono intenzionalmente ai tuoi dati privati ​​che sono di progettazione pericolosa e contro il paradigma OOP – Geoffroy

+0

@Geoffroy, quindi pensi che sia una cattiva idea avere 'IBOutlet's e' IBAction's nel file di implementazione solo? – Enchilada

Problemi correlati