Quanto è buono usare extern nell'obiettivo C? Fa sì che la codifica di alcune parti sia facile ... ma non rovina l'orientamento dell'oggetto?Uso di extern nell'obiettivo C
risposta
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.
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.
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
Dove posso trovare ulteriori informazioni sul suggerimento di Hillegass? Conosci l'URL? – Joshua
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 –
Perché devo usare extern? Non posso semplicemente dichiarare una variabile statica? Grazie – aneuryzm
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.
Hm .. Ma riduce la leggibilità del codice se l'uso non è documentato in misura maggiore. –
C'è un modo per usarlo con una dichiarazione di classe? (ad esempio http://stackoverflow.com/questions/22798660/extern-with-class-in-objective-c) – Senseful
Considera anche FOUNDATION_EXPORT poiché funziona anche con il codice C++. http://stackoverflow.com/a/10953284/142358 –