2011-01-03 14 views
3

Ich habe den folgenden Code in meinem ApplicationDelegate. Mein Implementierungsziel 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 starte, aber auf dem Simulator, der 4.2 hat, läuft es gut.EXC_BAD_ACCESS mit NSUserdefaults auf iphone

Dieses Problem ist jetzt Gelöst. Der Code unten funktioniert, und es hat eine EXC_BAD_ACCESS aufgrund einer NSURLConnection in meinem Code. Ich werde meinen Code nicht löschen, wenn jemand anderes dieses Problem hat. Danke 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> 

Applicationdelegate

+ (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]; 
} 

Antwort

1

Die registerDefaults: Methode ist seit iOS 2.0 (See Documentation) verfügbar, so dass das nicht das Problem sein sollte. Das Problem stammt vermutlich vom regDictionary-Objekt und davon, wie Sie es füllen.

Werfen Sie einen Blick auf diese vorherige Frage. Die Hauptantwort hat eine ausgezeichnete Methode, um das zu tun, was Sie erreichen möchten. In der Tat ist der Code fast identisch mit der Ausnahme, wie die Einstellungen Bündel zugegriffen wird:

- (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 Can you make the settings in Settings.bundle default even if you don't open the Settings App

Hier ist der Code Sie (direkt aus der verknüpften Frage oben aus der Antwort von PCheese Gestohlene) wollen : Nun, da ich Ihren pList sehe, ändern PSToggleSwitchSpecifier den Standardwert <true/>-<string>YES</string>

+0

Ja, Sie haben Recht! Es hat etwas mit meinem regDictionary zu tun. Aber ich weiß noch nicht was. Danke, dass Sie mich in die richtige Richtung weisen, weil der Fehler weg ist, wenn ich ihn mit Dummy-Werten fülle. – LuckyLuke

+0

Ich habe meine Antwort mit Code von @PCheese aktualisiert, die den Trick tun sollte – theChrisKent

+0

Leider tat es nicht :( – LuckyLuke

0

Versuchen Sie, die registerDefaults in die Schleife zu bewegen.

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

mir Es gibt noch EXC_BAD_ACCESS ERROR :( – LuckyLuke

+0

Haben Sie die Zeile aus dem botto entfernen m und benutze es einfach in der Schleife? Hast du auch einen Fehler bekommen, als die Zeile in der Schleife lief? –

+0

Ja, ich habe die Zeile von unten entfernt. Ich benutze setObject: value .... die Präferenz, die ich versuche zu registrieren, ist ein boolscher Wert im Settings.bundle, nur um das zu erwähnen. – LuckyLuke

0

Das Problem hier ist nicht der Unterschied zwischen Oss, aber der Unterschied zwischen Gerät und Simulator. Der Simulator verwendet das Mac OS X-Dateisystem, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird, das Dateisystem auf iOS jedoch.

Sie sollten also überprüfen @ @ "Settings.bundle/Root.plist" und @ "PreferenceSpecifiers", wenn ihre Feststelltaste richtig ist.

+0

Überprüft jetzt, und sie sind korrekt. Ich kann hinzufügen, dass es auf dem iPhone 3GS mit 4.0.1 funktioniert. Das Gerät, das ich versuche, meine App jetzt zu bearbeiten, ist iPhone (erste Generation). 3.1.3 – LuckyLuke