Gebruik van extern in Objective C

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 externveel 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 externbederft niet noodzakelijkerwijs de objectoriëntatie. Zelfs in OO is het gebruikelijk om variabelen te gebruiken die overal toegankelijk zijn. Het gebruik van externis de meest voorkomende oplossing voor het ontbreken van “klassenvariabelen” (zoals die gedeclareerd met staticin 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 externook 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 externzoekwoord 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 externin 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.

Other episodes