2009-12-22 34 views

risposta

54

vi accorgerete che la extern è usato ampiamente nei quadri di cacao, e uno sarebbe fatica a trovare un argomento convincente che la loro OO è "viziata". Al contrario, Cocoa è ben incapsulato e espone solo ciò che deve, spesso tramite extern. Le costanti definite globalmente sono sicuramente l'uso più comune, ma non necessariamente l'unico uso valido.

IMO, utilizzando extern non necessariamente "rovina" l'orientamento dell'oggetto. Anche in OO, è frequente l'uso di variabili accessibili da qualsiasi luogo. L'utilizzo di extern rappresenta la soluzione più frequente per la mancanza di "variabili di classe" (come quelle dichiarate con static in Java) in Objective-C. Ti permette di espandere l'ambito in cui puoi fare riferimento a un simbolo oltre l'unità di compilazione in cui è dichiarato, essenzialmente promettendo che verrà definito da qualche parte da qualcuno.

È inoltre possibile combinare extern con __attribute__((visibility("hidden"))) per creare un simbolo che può essere utilizzato all'esterno dell'unità di compilazione, ma non al di fuori dell'unità di collegamento, per così dire. Ho usato questo per la libreria personalizzata e il codice framework per incapsulare correttamente i dettagli interni di livello superiore.

+0

Hm .. Ma riduce la leggibilità del codice se l'uso non è documentato in misura maggiore. –

+0

C'è un modo per usarlo con una dichiarazione di classe? (ad esempio http://stackoverflow.com/questions/22798660/extern-with-class-in-objective-c) – Senseful

+0

Considera anche FOUNDATION_EXPORT poiché funziona anche con il codice C++. http://stackoverflow.com/a/10953284/142358 –

10

Dipende da cosa lo usi. È perfettamente valido utilizzarlo per accedere a costanti definite globalmente.
Se si dispone di un oggetto globale, tuttavia, suggerirei di utilizzare invece Singleton.

15

Esistono alcuni casi di utilizzo per la parola chiave extern in Objective-C.
Aaron Hillegass suggerisce di creare nomi di notifiche globali extern. esempio:

extern NSString* const XYYourNotification; 

quindi definire l'attuale NSString* nell'implementazione

+0

Dove posso trovare ulteriori informazioni sul suggerimento di Hillegass? Conosci l'URL? – Joshua

+1

L'ho visto per la prima volta in "Cocoa Programming per Mac OS X" (Aaron Hillegass). Uno dei migliori libri correlati al cacao che ho letto finora. http://www.bignerdranch.com/book/cocoa®_programming_for_mac®_os_x_3rd_edition –

+0

Perché devo usare extern? Non posso semplicemente dichiarare una variabile statica? Grazie – aneuryzm

2

A seconda delle esigenze, ad esempio la pagina di accesso. Dopo aver effettuato l'accesso, si sta notificando ad altre pagine nelle applicazioni.

#import <Foundation/Foundation.h> 

extern NSString *const DidLoginNotification; 

@interface LoginViewController : NSObject 
- (void)login; 
@end 


// LoginViewController.m 
#import "LoginViewController.h" 

//define extern const in implementation file only once for the whole process 
NSString *const DidLoginNotification = 
    @"DidLoginNotificationNotified"; 

@implementation LoginViewController 

- (void)login { 
    // Perform notification 
    [[NSNotificationCenter defaultCenter]; 
    sendNotificationName: DidLoginNotification 
                    object:nil]; 
} 

La parte che riceve la notifica non ha bisogno di conoscere il valore del const.