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

Property lists og arkivering

Lær at gemme og indlæse simple datastrukturer med NSUserDefaults, property lists og NSKeyedArchiver.

Lektion 1 af 412 trin

Property lists og arkivering er en gratis Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer-lektion på CoddyKit. Dette er lektion 1 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.

Hvorfor skal data bevares?

Når din app lukkes, forsvinder alle data, der kun findes i hukommelsen. Hvis du vil bevare brugerindstillinger, spilforløb eller andre vigtige oplysninger, har du brug for datapersistens.

Datapersistens betyder, at data gemmes på en permanent lagerplacering, f.eks. i en fil på enheden, så de kan hentes senere.

Forstå egenskabslister

Egenskabslister (PLists) er en standardmetode til at gemme strukturerede data i iOS-apps. De er XML- eller binærfiler, der repræsenterer almindelige datatyper.

  • Understøttede typer: NSString, NSNumber, NSDate, NSData, NSArray, NSDictionary.
  • PLists er velegnede til små, hierarkiske datamængder som brugerindstillinger eller konfigurationsindstillinger.

NSUserDefaults til simple data

NSUserDefaults er en praktisk måde at gemme små datamængder på, typisk brugerindstillinger eller programindstillinger.

Det fungerer som en ordbog, der gemmer nøgleværdi-par direkte i en egenskabslistefil, som systemet administrerer. Det er ideelt til simple datatyper.

Gemme med NSUserDefaults

Hvis du vil gemme data ved hjælp af NSUserDefaults, henter du objektet med standardbrugerindstillingerne og bruger derefter metoder som setObject:forKey: eller setInteger:forKey:.

Metoden synchronize (som ofte ikke er strengt nødvendig i moderne iOS) sikrer, at data straks skrives til disken.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        
        // Save a string
        [defaults setObject:@"CoddyKit User" forKey:@"username"];
        
        // Save an integer
        [defaults setInteger:123 forKey:@"userScore"];
        
        // Optional: Ensure data is written immediately
        [defaults synchronize];
        
        NSLog(@"Data saved to NSUserDefaults!");
    }
    return 0;
}

Indlæse med NSUserDefaults

Det er lige så nemt at hente data! Brug metoder som stringForKey: eller integerForKey: med de samme nøgler, som du brugte ved lagringen.

Husk, at hvis en nøgle ikke findes, får du nil for objekter eller en standardværdi (f.eks. 0 for heltal).

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        
        // Load a string
        NSString *username = [defaults stringForKey:@"username"];
        
        // Load an integer
        NSInteger userScore = [defaults integerForKey:@"userScore"];
        
        NSLog(@"Loaded Username: %@", username ? username : @"(Not set)");
        NSLog(@"Loaded User Score: %ld", (long)userScore);
    }
    return 0;
}

Ud over NSUserDefaults

Selvom NSUserDefaults er velegnet til simple data, har det begrænsninger:

  • Det er ikke egnet til store datamængder.
  • Det håndterer kun typer, der er kompatible med egenskabslister.
  • Det kan ikke nemt gemme brugerdefinerede objekter (medmindre de konverteres til NSData).

Til mere komplekse data, især brugerdefinerede objekter, har vi brug for en anden tilgang: arkivering.

Arkivere brugerdefinerede objekter

Arkivering gør det muligt at konvertere komplekse objektgrafer (f.eks. instanser af dine brugerdefinerede klasser) til en flad, binær repræsentation (NSData).

Disse NSData-data kan derefter gemmes i en fil eller endda i NSUserDefaults. De vigtigste komponenter her er protokollen NSCoding og NSKeyedArchiver.

Implementere NSCoding-protokollen

Hvis dine brugerdefinerede Objective-C-objekter skal kunne arkiveres, skal de overholde protokollen NSCoding.

Det indebærer implementering af to metoder: encodeWithCoder: (til at gemme egenskaber) og initWithCoder: (til at indlæse egenskaber).

#import <Foundation/Foundation.h>

@interface GameScore : NSObject <NSCoding>
@property (nonatomic, strong) NSString *playerName;
@property (nonatomic) NSInteger score;
@end

@implementation GameScore

- (instancetype)initWithPlayerName:(NSString *)name score:(NSInteger)value {
    self = [super init];
    if (self) {
        _playerName = name;
        _score = value;
    }
    return self;
}

// Save properties to the coder
- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.playerName forKey:@"playerName"];
    [coder encodeInteger:self.score forKey:@"score"];
}

// Load properties from the coder
- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super init];
    if (self) {
        _playerName = [coder decodeObjectForKey:@"playerName"];
        _score = [coder decodeIntegerForKey:@"score"];
    }
    return self;
}

- (NSString *)description {
    return [NSString stringWithFormat:@"Player: %@, Score: %ld", self.playerName, (long)self.score];
}

@end

Arkivere med NSKeyedArchiver

Når din brugerdefinerede klasse overholder NSCoding, kan du bruge NSKeyedArchiver til at konvertere et objekt til NSData.

Dette eksempel viser, hvordan du opretter et GameScore-objekt og arkiverer det. De resulterende NSData-data kan derefter skrives til en fil.

#import <Foundation/Foundation.h>

// GameScore class (from previous scene)
@interface GameScore : NSObject <NSCoding>
@property (nonatomic, strong) NSString *playerName;
@property (nonatomic) NSInteger score;
@end
@implementation GameScore
- (instancetype)initWithPlayerName:(NSString *)name score:(NSInteger)value { self = [super init]; if (self) { _playerName = name; _score = value; } return self; }
- (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.playerName forKey:@"playerName"]; [coder encodeInteger:self.score forKey:@"score"]; }
- (instancetype)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { _playerName = [coder decodeObjectForKey:@"playerName"]; _score = [coder decodeIntegerForKey:@"score"]; } return self; }
- (NSString *)description { return [NSString stringWithFormat:@"Player: %@, Score: %ld", self.playerName, (long)self.score]; }
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        GameScore *playerData = [[GameScore alloc] initWithPlayerName:@"Hero" score:1000];
        
        NSError *error = nil;
        NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:playerData
                                                      requiringSecureCoding:NO
                                                                      error:&error];
        
        if (archivedData && !error) {
            NSLog(@"GameScore object archived successfully! Data length: %lu bytes", (unsigned long)archivedData.length);
            // In a real app, you'd save archivedData to a file, e.g.,
            // [archivedData writeToFile:@"/tmp/game_score.data" atomically:YES];
        } else {
            NSLog(@"Archiving failed: %@", error);
        }
    }
    return 0;
}

Afarkivere med NSKeyedUnarchiver

Hvis du vil hente dit objekt igen, bruger du NSKeyedUnarchiver til at konvertere NSData-dataene tilbage til et objekt.

Denne proces kalder metoden initWithCoder: i din klasse, der overholder NSCoding, og genskaber objektet.

#import <Foundation/Foundation.h>

// GameScore class (from previous scene)
@interface GameScore : NSObject <NSCoding>
@property (nonatomic, strong) NSString *playerName;
@property (nonatomic) NSInteger score;
@end
@implementation GameScore
- (instancetype)initWithPlayerName:(NSString *)name score:(NSInteger)value { self = [super init]; if (self) { _playerName = name; _score = value; } return self; }
- (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.playerName forKey:@"playerName"]; [coder encodeInteger:self.score forKey:@"score"]; }
- (instancetype)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { _playerName = [coder decodeObjectForKey:@"playerName"]; _score = [coder decodeIntegerForKey:@"score"]; } return self; }
- (NSString *)description { return [NSString stringWithFormat:@"Player: %@, Score: %ld", self.playerName, (long)self.score]; }
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // Simulate archived data (in a real app, you'd load from a file)
        GameScore *originalPlayerData = [[GameScore alloc] initWithPlayerName:@"Hero" score:1000];
        NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:originalPlayerData requiringSecureCoding:NO error:nil];
        
        if (archivedData) {
            NSError *error = nil;
            GameScore *loadedPlayerData = [NSKeyedUnarchiver unarchivedObjectOfClass:[GameScore class]
                                                                             fromData:archivedData
                                                                                error:&error];
            
            if (loadedPlayerData && !error) {
                NSLog(@"Unarchived Player Data: %@", loadedPlayerData);
                NSLog(@"Player Name: %@", loadedPlayerData.playerName);
                NSLog(@"Score: %ld", (long)loadedPlayerData.score);
            } else {
                NSLog(@"Unarchiving failed: %@", error);
            }
        } else {
            NSLog(@"Archiving failed, cannot unarchive.");
        }
    }
    return 0;
}

Hurtigt tjek: Datalagring

Hvilken af følgende muligheder er BEDST egnet til at gemme en brugers indstilling for »mørk tilstand« (en simpel boolesk værdi) i en Objective-C-iOS-app?

Opsamling og næste trin

Godt gået! Du har lært det grundlæggende om datavedholdenhed i Objective-C:

  • Egenskabslister (PLists): XML- eller binærfiler til strukturerede data.
  • NSUserDefaults: Ideelt til små brugerindstillinger og programindstillinger ved hjælp af nøgleværdi-par.
  • NSCoding og NSKeyedArchiver: Til at konvertere brugerdefinerede objekter til NSData med henblik på lagring og hentning.

Disse metoder er afgørende for, at dine apps kan huske oplysninger mellem sessioner. Derefter undersøger vi Core Data, som giver mere robust håndtering af objektgrafer!

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 “Property lists og arkivering” gratis?

Ja — hele teksten til “Property lists og arkivering” 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 “Property lists og arkivering”?

Lær at gemme og indlæse simple datastrukturer med NSUserDefaults, property lists og NSKeyedArchiver. 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 1 af 4.

Hvor lang tid tager lektionen “Property lists og arkivering”?

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. Property lists og arkivering
  2. Grundlæggende om Core Data
  3. SQLite-integration med FMDB
  4. Lagring af indstillinger med NSUserDefaults
← Tilbage til Objective-C-udvikling til iOS med ældre og virksomhedsapplikationer