2011-01-03 8 views
3

私のApplicationDelegateには次のコードがあります。私の展開ターゲットは3.0以上ですが、iPhoneを3.1.3で起動するとEXC_BAD_ACCESSが表示されますが、シミュレータ上では4.2が正常に動作します。iphoneのNSUserdefaultsを使用したEXC_BAD_ACCESS

この問題は現在SOLVEDです。以下のコードは動作しており、コード内にNSURLConnectionがあるため、EXC_BAD_ACCESSがあります。他の誰かがこの問題を抱えたら、私は自分のコードを削除しません。ご協力いただきありがとうございます。

UPDATE: plistファイル:

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

答えて

1

iOS 2.0(See Documentation)以降、registerDefaults:メソッドが使用可能になっているため、問題ではありません。この問題はおそらく、regDictionaryオブジェクトとそれをどのように埋めているかが原因です。

この前の質問をご覧ください。主な答えはあなたが達成しようとしていることを実行する優れた方法を持っています。実際にコードが設定バンドルにアクセスする方法を除いてほぼ同じです: Can you make the settings in Settings.bundle default even if you don't open the Settings App

ここでは、(PCheeseすることにより、上記の回答からリンクされている質問から直接盗まれた)をしたいコードがある

- (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 : 今、私はあなたのPLISTを見ていること、<string>YES</string>

+0

はい、あなたは正しいです!それは私のregDictionaryと関係があるものです。しかし、私はまだ何がわかりません。ダミーの値を入力するとエラーがなくなるため、正しい方向に私を指してくれてありがとう。 – LuckyLuke

+0

@ PCheeseのコードで私の答えを更新しました – theChrisKent

+0

残念ながらそれはしませんでした:( – LuckyLuke

0

ループにregisterDefaultsを移動してみてください。

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

<true/>からあなたPSToggleSwitchSpecifierのデフォルト値を変更してそれはまだ私にEXC_BAD_ACCESSエラーを与える:( – LuckyLuke

+0

あなたはだぼっから行を削除しましたmループの中で使っていますか?また、ループ内の行が実行されたときにエラーが発生しましたか? –

+0

はい私は下から行を削除しました。私はsetObject:valueを使用します。私が登録しようとするプリファレンスは、それを言及するだけで、Settings.bundleのブール値です。 – LuckyLuke

0

ここでの問題は、OSの違いではなく、デバイスとシミュレータの違いです。 SimulatorはMac OS Xファイルシステムを使用しますが、大文字と小文字は区別されませんが、iOS上のファイルシステムは、

キャップのロックが正しい場合は、@ "Settings.bundle/Root.plist"と@ "PreferenceSpecifiers"を再度確認してください。

+0

今すぐチェックしてください。正しいものです。 iPhone 3GS 4.0.1で動作すると付け加えます。 私のアプリケーションを今すぐ稼働させようとしているのは、iPhone(第1世代)です。3.1。3 – LuckyLuke

関連する問題