Hoe goed is het om extern te gebruiken in Objective C?
Het maakt het coderen voor sommige delen wel gemakkelijk… maar bederft het de objectoriëntatie niet?
Antwoord 1, autoriteit 100%
Je zult zien dat extern
veel wordt gebruikt in de Cocoa-frameworks, en het zou moeilijk zijn om een overtuigend argument te vinden dat hun OO “verwend” is. Integendeel, Cacao is goed ingekapseld en onthult alleen wat het moet, vaak via extern. Wereldwijd gedefinieerde constanten zijn zeker het meest voorkomende gebruik, maar niet noodzakelijk het enige geldige gebruik.
IMO, het gebruik van extern
bederft niet noodzakelijkerwijs de objectoriëntatie. Zelfs in OO is het gebruikelijk om variabelen te gebruiken die overal toegankelijk zijn. Het gebruik van extern
is de meest voorkomende oplossing voor het ontbreken van “klassenvariabelen” (zoals die gedeclareerd met static
in Java) in Objective-C. Hiermee kunt u de reikwijdte uitbreiden waarin u naar een symbool kunt verwijzen buiten de compilatie-eenheid waar het wordt gedeclareerd, in wezen door te beloven dat het ergens door iemand zal worden gedefinieerd.
Je kunt extern
ook combineren met __attribute__((visibility("hidden")))
om een symbool te maken dat buiten de compilatie-eenheid kan worden gebruikt, maar niet daarbuiten. zijn koppelingseenheid, om zo te zeggen. Ik heb dit gebruikt voor aangepaste bibliotheek- en frameworkcode om interne details op een hoger niveau correct in te kapselen.
Antwoord 2, autoriteit 26%
Er zijn enkele toepassingen voor het extern
zoekwoord in Objective-C.
Aaron Hillegass stelt voor om wereldwijde meldingsnamen extern te maken.
bijv.:
extern NSString* const XYYourNotification;
Vervolgens definieert u de daadwerkelijke NSString*
in uw implementatie
Antwoord 3, autoriteit 16%
Het hangt ervan af waar je het voor gebruikt.
Het is perfect geldig om het te gebruiken om toegang te krijgen tot globaal gedefinieerde constanten.
Als je echter een globaal object hebt, raad ik aan om Singletonin plaats daarvan.
Antwoord 4, autoriteit 11%
Nog een voorbeeld van een probleem bij het niet gebruiken van extern
:
Stel dat je een globale variabele in een headerbestand hebt:
NSString *globalVar = @"Wonderful";
En je gebruikt het op 3 plaatsen door dat headerbestand te importeren. Je code wil niet compileren, de linker klaagt dat je 3 dubbele symbolen hebt gedefinieerd in je code. Er zijn twee manieren om het op te lossen:
Gebruik static
, in welk geval voor elk bestand dat die header importeert een aparte referentie wordt gedefinieerd (en het wijzigen van één tekenreeks heeft geen invloed op de andere tekenreeksen die in andere bestanden zijn geïmporteerd):
static NSString *globalVar = @"Wonderful";
Gebruik extern
in het .h-bestand en definieer het in het .m-bestand. Op deze manier wordt er slechts één referentie gedefinieerd en gebruikt elk bestand dezelfde referentie (wijzigingen worden in alle bestanden weergegeven):
extern NSString *globalVar; // in .h
NSString *globalVar = @"Wonderful"; // in .m
Kies de aanpak die het beste past.
Antwoord 5, autoriteit 5%
Afhankelijk van uw behoefte, u heeft bijvoorbeeld een inlogpagina. Nadat u bent ingelogd, stuurt u een melding naar andere pagina’s in de applicaties.
#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];
}
De melding ontvangende partij hoeft de waarde van de const.