Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer · Lektion

Egenskaber og instansvariabler

Forstå forskellen mellem egenskaber og instansvariabler, og hvordan De bruger dem til datalagring i objekter.

Lektion 2 af 411 trin

Egenskaber og instansvariabler er en gratis Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-kurset indeholder 4 lektioner i alt.

Data i dine objekter

Når du opretter objekter i Objective-C, skal de ofte gemme oplysninger. Tænk på et Person-objekt, der skal gemme et navn og en alder.

Disse data gemmes enten ved hjælp af instansvariabler eller egenskaber. Begge indeholder data, men de giver forskellige grader af kontrol og sikkerhed.

Instansvariabler (IVars)

Instansvariabler (ofte kaldet ivars) er variabler, der deklareres direkte i en klasses interface- eller implementeringsblok. De indeholder de faktiske data for et objekt.

  • De fungerer som direkte lagerpladser i dit objekt.
  • Du kan tilgå dem direkte fra objektets metoder.
  • Direkte adgang udefra til objektet frarådes generelt af hensyn til god objektorienteret praksis.

Deklarér en instansvariabel

Du deklarerer instansvariabler i blokken @interface, typisk inden i krøllede parenteser {}. Som standard er de @protected.

Prøv at køre dette simple eksempel:

#import <Foundation/Foundation.h>

@interface MyObject : NSObject {
    // This is an instance variable
    int myValue;
}
- (void)printValue;
@end

@implementation MyObject
- (void)printValue {
    NSLog(@"My value is: %d", myValue);
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyObject *obj = [[MyObject alloc] init];
        obj->myValue = 10; // Direct access (usually avoided externally)
        [obj printValue];
    }
    return 0;
}

Introduktion til egenskaber (`@property`)

Mens ivars gemmer data, giver egenskaber en kontrolleret måde at tilgå disse data på. En egenskabsdeklaration genererer automatisk getter- og setter-metoder.

  • Getter: En metode til at hente værdien (f.eks. name).
  • Setter: En metode til at ændre værdien (f.eks. setName:).

Det er afgørende for indkapsling og styring af, hvordan data læses og skrives.

Deklarér en egenskab

Du deklarerer egenskaber ved hjælp af direktivet @property i blokken @interface. Det fortæller compileren, at den skal forberede accessor-metoder.

For eksempel deklarerer @property (assign) int age; en age-egenskab.

#import <Foundation/Foundation.h>

@interface Person : NSObject
// Declare a property for name and age
@property (strong, nonatomic) NSString *name;
@property (assign, nonatomic) int age;

- (void)introduce;
@end

@implementation Person
// @synthesize name = _name; // Not strictly needed in modern Objective-C
// @synthesize age = _age;   // The compiler synthesizes automatically

- (void)introduce {
    NSLog(@"Hello, my name is %@ and I am %d years old.", self.name, self.age);
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        person.name = @"Alice"; // Using dot syntax (setter)
        person.age = 30;       // Using dot syntax (setter)
        [person introduce];    // Accessing via getter inside method
    }
    return 0;
}

Egenskabers attributter: Hukommelse

Egenskaber kan have attributter, der påvirker, hvordan deres accessor-metoder genereres, især med hensyn til hukommelseshåndtering (selvom fuld ARC gennemgås senere).

  • strong (standard for objekter): Bevarer en stærk reference, så objektet ikke frigives.
  • weak: Opretter en svag reference, så objektet kan frigives, hvis der ikke findes stærke referencer. Forhindrer retain-cyklusser.
  • assign (standard for primitive typer): Bruges til typer, der ikke er objekter (int, float, structs). Tildeler blot værdien.
  • copy: Opretter en kopi af objektet i stedet for at beholde den oprindelige reference. Nyttigt til mutable objekter som NSString, så eksterne ændringer forhindres.

Attributter for egenskaber: Atomisk adgang

En anden vigtig attribut handler om trådsikkerhed:

  • atomic (standard): Sørger for, at getter- og setter-metoderne er trådsikre. Det betyder, at der altid returneres eller tildeles en komplet værdi, selv hvis flere tråde forsøger at tilgå den samtidig.
  • nonatomic: Garanterer ikke trådsikkerhed for accessorer. Dette er hurtigere og bruges ofte, når du selv håndterer trådsikkerheden, eller når den ikke er nødvendig for en bestemt egenskab.

I det meste iOS-udvikling foretrækkes nonatomic af hensyn til ydeevnen, medmindre den pågældende egenskab specifikt kræver trådsikkerhed.

Punktnotation kontra meddelelsesnotation

Egenskaber giver dig mulighed for at bruge punktnotation (f.eks. object.name), som er en praktisk genvej til at kalde getter- og setter-metoderne.

  • object.name svarer til [object name] (getter).
  • object.name = @"Bob"; svarer til [object setName:@"Bob"] (setter).

Begge dele er gyldige, men punktnotation bruges ofte til egenskaber for at gøre koden lettere at læse.

#import <Foundation/Foundation.h>

@interface Car : NSObject
@property (strong, nonatomic) NSString *model;
@property (assign, nonatomic) int year;
@end

@implementation Car
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Car *myCar = [[Car alloc] init];
        
        // Using dot syntax to set values
        myCar.model = @"Tesla Model 3";
        myCar.year = 2023;
        
        // Using dot syntax to get values
        NSString *carModel = myCar.model;
        int carYear = myCar.year;
        
        NSLog(@"Car: %@, Year: %d", carModel, carYear);
        
        // Equivalent message syntax for setting
        [myCar setModel:@"Ford F-150"];
        [myCar setYear:2020];
        
        // Equivalent message syntax for getting
        NSString *newModel = [myCar model];
        int newYear = [myCar year];
        
        NSLog(@"New Car: %@, Year: %d", newModel, newYear);
    }
    return 0;
}

Instansvariabler kontra egenskaber: Hvornår skal du bruge hvad

Generelt bør du bruge egenskaber til næsten al datalagring, der skal kunne tilgås udefra objektet eller konsekvent inde i objektet.

  • Brug egenskaber til offentlig eller privat adgang til data, så du kan drage fordel af deres accessor-metoder og attributter.
  • Brug kun rå instansvariabler (ivars), hvis du skal gemme data, der aldrig må tilgås direkte, heller ikke af underklasser, eller hvis du har brug for meget specifikke ydeevneoptimeringer, hvor accessor-overhead absolut skal undgås (sjældent).

Moderne Objective-C med ARC foretrækker i høj grad egenskaber.

Hurtigt tjek af egenskaber

Se på følgende Objective-C-erklæring af en egenskab:

@property (nonatomic, copy) NSString *productName;

Hvilket af følgende udsagn er SANDT om denne egenskab?

Opsummering: Instansvariabler og egenskaber

Vi har gennemgået, hvordan Objective-C-objekter gemmer data ved hjælp af instansvariabler og egenskaber.

  • Instansvariabler (ivars) er direkte lagerpladser i et objekt.
  • Egenskaber giver kontrolleret adgang til data via genererede getter- og setter-metoder.
  • Vigtige egenskabsattributter som strong, weak, assign og copy håndterer hukommelsen.
  • atomic og nonatomic styrer trådsikkerheden for accessor-metoder.
  • Punktnotation er en praktisk måde at tilgå egenskaber på og oversættes til metodekald.
  • Egenskaber er den foretrukne måde at håndtere objektdata på i moderne Objective-C.
Gratis at komme i gang

Lær Objective-C med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Egenskaber og instansvariabler” gratis?

Ja — hele teksten til “Egenskaber og instansvariabler” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-kurset, skal du opgradere til CoddyKit PRO. Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Egenskaber og instansvariabler”?

Forstå forskellen mellem egenskaber og instansvariabler, og hvordan De bruger dem til datalagring i objekter. Du øver dig i Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer?

Der kræves ingen tidligere erfaring. Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Egenskaber og instansvariabler”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektion?

Ja. Alle Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Klasser, objekter og metoder
  2. Egenskaber og instansvariabler
  3. Protokoller og kategorier
  4. Nedarvning og tilsidesættelse af metoder
← Tilbage til Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer