3 Stimmen

EXC_BAD_ACCESS mit NSUserdefaults auf iphone

Ich habe den folgenden Code in meinem ApplicationDelegate. Mein Bereitstellungsziel ist 3.0 und höher, jedoch erhalte ich eine EXC_BAD_ACCESS, wenn ich die App mit dem folgenden Code auf meinem iPhone mit 3.1.3 starten, jedoch auf dem Simulator, der 4.2 hat es läuft gut.

Dieses Problem ist nun GELÖST . Der Code unten funktioniert, und es bekam eine EXC_BAD_ACCESS aufgrund einer NSURLConnection in meinem Code. Ich werde meinen Code nicht löschen, wenn jemand anderes dieses Problem hat. Vielen Dank für Ihre Hilfe.

UPDATE: Plist-Datei:

<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
    <dict>
        <key>Type</key>
        <string>PSGroupSpecifier</string>
        <key>Title</key>
        <string>Check for report on start?</string>
    </dict>
    <dict>
        <key>Type</key>
        <string>PSToggleSwitchSpecifier</string>
        <key>Title</key>
        <string>Autocheck reports?</string>
        <key>Key</key>
        <string>FAutoUpdatePrefKey</string>
        <key>DefaultValue</key>
        <true/>
    </dict>
</array>

Anwendungsdelegierte

+ (void)initialize {

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *pListPath = [path stringByAppendingPathComponent:@"Settings.bundle/Root.plist"];

NSDictionary *pList = [NSDictionary dictionaryWithContentsOfFile:pListPath];

NSMutableArray *prefsArray = [pList objectForKey:@"PreferenceSpecifiers"];
NSMutableDictionary *regDictionary = [NSMutableDictionary dictionary];

for (NSDictionary *dict in prefsArray) {
    NSString *key = [dict objectForKey:@"Key"];
    if(key) {
        id value = [dict objectForKey:@"DefaultValue"];
        [regDictionary setObject:value forKey:key];
    }
}
[[NSUserDefaults standardUserDefaults] registerDefaults:regDictionary];
}

1voto

theChrisKent Punkte 14951

Die Methode registerDefaults: ist seit iOS 2.0 verfügbar ( Siehe Dokumentation ), das sollte also nicht das Problem sein. Das Problem stammt wahrscheinlich aus dem regDictionary-Objekt und wie Sie es füllen.

Werfen Sie einen Blick auf die vorherige Frage. Die Hauptantwort enthält eine ausgezeichnete Methode, um das zu tun, was Sie zu erreichen versuchen. In der Tat ist der Code fast identisch, mit Ausnahme der Art und Weise, wie auf das Einstellungsbündel zugegriffen wird: Können Sie die Einstellungen in Settings.bundle auch dann als Standard festlegen, wenn Sie die Settings-App nicht öffnen?

Hier ist der gewünschte Code (direkt aus der oben verlinkten Frage und der Antwort von PC-Käse )

- (void)registerDefaultsFromSettingsBundle {
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    if(!settingsBundle) {
        NSLog(@"Could not find Settings.bundle");
        return;
    }

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
    for(NSDictionary *prefSpecification in preferences) {
        NSString *key = [prefSpecification objectForKey:@"Key"];
        if(key) {
            [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
        }
    }

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
    [defaultsToRegister release];
}

UPDATE: Jetzt, wo ich Ihre pList sehe, ändern Sie den Standardwert Ihres PSToggleSwitchSpecifier von <true/> a <string>YES</string>

0voto

Larry Hipp Punkte 6055

Versuchen Sie, die registerDefaults in die Schleife zu verschieben.

for (NSDictionary *dict in prefsArray) {
       NSString *key = [dict objectForKey:@"Key"];
       if(key) {
           id value = [dict objectForKey:@"DefaultValue"];
           [[NSUserDefaults standardUserDefaults] setObject:value forKey:key]; //<-change               
       }
}

0voto

tadejsv Punkte 1988

Das Problem hier ist nicht der Unterschied zwischen den Betriebssystemen, sondern der Unterschied zwischen Gerät und Simulator. Der Simulator verwendet das Dateisystem von Mac OS X, das nicht zwischen Groß- und Kleinschreibung unterscheidet, das Dateisystem von iOS hingegen schon.

Überprüfen Sie daher @"Settings.bundle/Root.plist" und @"PreferenceSpecifiers", ob die Feststelltaste korrekt ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X