2012-02-10 7 views
10

Va bene assegnare AppDelegate come variabile di istanza in un UIViewController? Come @property (nonatomic, weak) AppDelegate *appDelegate;iOS - AppDelegate come variabile di istanza?

questo che sto chiedendo è perché ho bisogno di accedervi abbastanza spesso così invece di fare:

AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 

[appDelegate doSomething]; 

che potevo fare:

[appDelegate doSomething]

+2

Se accedete così spesso, perché non spostare quel lavoro altrove? – Osiris

risposta

12

Oppure si potrebbe fare

-(YourAppDelegate*) app 
{ 
    return (YourAppDelegate*) [[UIApplication sharedApplication] delegate]; 
} 

In una sottoclasse di UIViewController - poi fare che la classe base di tutti i controller di vista.

Quindi, [self app] funziona e non è necessario mantenere un riferimento.

Faccio questo per mantenere alcune semplici utilità comuni - puoi farlo anche con una categoria.

4

La distinzione tra l'accesso alla delegare per piena espressione rispetto a una proprietà (non anatomica, debole) è arbitrario. Certamente, salva te stesso le righe di codice definendo una proprietà se la chiamerai frequentemente.

La domanda solleva un problema più ampio di un possibile problema di incapsulamento, tuttavia. Le migliori pratiche suggeriscono che le chiamate scendano dalla gerarchia verso l'alto. Ovviamente il delegato dell'app è un po 'speciale, ma il mio consiglio sarebbe di considerare possibili modi per isolare qualsiasi risorsa di cui si ha bisogno dal delegato dell'app e passare questi riferimenti lungo la gerarchia del controller di visualizzazione mentre quella gerarchia è creato.

16

Forse potrebbe essere ok.

Ma la mia soluzione preferita è la seguente.

Nella tua AppDelegate.h

+ (AppDelegate *)appDelegate; 

Nella tua AppDelegate.m

+ (AppDelegate *)appDelegate 
{ 
    return (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

Quindi utilizzare dove vuoi:

AppDelegate* sharedDelegate = [AppDelegate appDelegate]; 

Alcune note:

se si utilizza AppDelegate per dati condivisi è possibile leggere singletons-appdelegates-and-top-level.html.

se si utilizza AppDelegate per il flusso di lavoro applicazione logica si può leggere handling-your-initial-view-controllers-for-iphone/

Speranza che aiuta.

+0

'getAppDelegate' viola le [linee guida per la denominazione] di Apple (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282- BCIGIJJF).Un nome migliore sarebbe '+ (AppDelegate *) appDelegate;' o '+ (AppDelegate *) sharedAppDelegate;' –

+0

@AlexPretzlav grazie per la tua modifica. –

Problemi correlati