Egenskaber og instansvariabler
Forstå forskellen mellem egenskaber og instansvariabler, og hvordan De bruger dem til datalagring i objekter.
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 somNSString, 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.namesvarer 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,assignogcopyhåndterer hukommelsen. atomicognonatomicstyrer 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.
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
- Klasser, objekter og metoder
- Egenskaber og instansvariabler
- Protokoller og kategorier
- Nedarvning og tilsidesættelse af metoder