このプロジェクトはiOS5.0用です。自動参照カウントを設定しましたが、retainステートメントを記述した場合、とにかくコードをコンパイルできません。
ifと多くのifelseブランチを作成したくないので、関数でスイッチを作成しました。
私のコード部分は比較的単純で正しいように見えますが、次のようにしか見えません。
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
switch (selectedRow) {
case 0://English
[userDefaults setObject:@"English" forKey:@"language"];
break;
case 1:// Deutsch
[userDefaults setObject:@"German" forKey:@"language"];
break;
case 2://Français
[userDefaults setObject:@"French" forKey:@"language"];
break;
case 3://Italiano
[userDefaults setObject:@"Italian" forKey:@"language"];
break;
case 4://Español
[userDefaults setObject:@"Spanish" forKey:@"language"];
break;
default:
break;
}
// flush:
[userDefaults synchronize];
実行時に次のメッセージが表示されました。***-[MyClassretain]:割り当て解除されたインスタンス0x6e78580に送信されたメッセージで、場合によってはブランチの[userDefaultssetObject行のブレークラインとしてXCodeが表示されます。
Switchをコンパイルするときにコンパイルを見たところ、クラスが作成されます。しかし、Java、C#、またはObj-Cのどの言語であるかはわかりません。クラスを終了し、スイッチクラスを実行しているため、userDefaults変数の割り当てが解除されます。これが、userDefaultsオブジェクトの割り当てが解除される理由です。今、私はこのスイッチをどのように書いて動作させるかわからず、プロのように見えます。いずれの場合もuserDefaults変数を作成して、そこでフラッシュしたくありません。唯一の解決策は、このスイッチをif-elseに書き込むことです。
これは機能しています:
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
switch (selectedRow) {
case 0://English
{
[userDefaults setObject:@"English" forKey:@"language"];
}
break;
case 1:// Deutsch
{
[userDefaults setObject:@"German" forKey:@"language"];
}
break;
case 2://Français
{
[userDefaults setObject:@"French" forKey:@"language"];
}
break;
case 3://Italiano
{
[userDefaults setObject:@"Italian" forKey:@"language"];
}
break;
case 4://Español
{
[userDefaults setObject:@"Spanish" forKey:@"language"];
}
break;
default:
break;
}
// flush:
[userDefaults synchronize];
なぜ?
なぜそれが機能したのかわかりませんが、それよりも再びクラッシュしました。コード内で変数を移動しました:
スイッチ(selectedRow){
case 0://English { NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"English" forKey:@"language"]; // flush: [userDefaults synchronize]; } break; case 1:// Deutsch { NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"German" forKey:@"language"]; // flush: [userDefaults synchronize]; } break; case 2://Français { NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"French" forKey:@"language"]; // flush: [userDefaults synchronize]; } break; case 3://Italiano { NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"Italian" forKey:@"language"]; // flush: [userDefaults synchronize]; } break; case 4://Español { NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"Spanish" forKey:@"language"]; // flush: [userDefaults synchronize]; } break; default: break; }
これは再びクラッシュし、私は答えを確認するためにここに来ました
私は以下の提案を見ました:
NSArray * languages = [NSArray arrayWithObjects: @"English", @"German", @"French",@"Italian", @"Spanish", nil];
NSString * selectedLanguage = [languages objectAtIndex: selectedRow];
[[NSUserDefaults standardUserDefaults] setObject: selectedLanguage forKey:@"language"];
同じ行でこのクラッシュ:
[[NSUserDefaults standardUserDefaults] setObject: selectedLanguage forKey:@"language"];
- なにが問題ですか?信じられない。***-[MyClass保持]:割り当て解除されたインスタンス0x6b532c0に送信されたメッセージ
MyClassはUIViewContollerです。言語を選択し、いくつかのボタンを押して1または2画面に移動すると、戻って言語を再度選択するとクラッシュしますが、常にそうとは限りません。しかし、クラッシュすると、常に同じ行に、常に同じエラーメッセージが表示されます。
何がありますか
userDefaults setObject
ナビゲーション付き?
#------------------------------------------------- -本当の問題を手に入れました:解決策を見つけるのは簡単ではありません#------------------------------------ ---------------
私は次のように書きました:userDefaults setObjectまた私は書きました:これはARCプロジェクトであり、MyClassの保持で失敗します。これは私のコードではありません。
コードは、アクションシートを使用した言語選択です。検索を行うと、次のリンクが表示されます: ブロックを呼び出すEXC_BAD_ACCESS
- そこから、保持するのではなく、どこかにコピーを生成する必要があることがわかります。問題は、なぜsetObjectで保持が必要なのかということです。さて、変更リスナーが追加されたので...
// [[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@ "language" options:NSKeyValueObservingOptionNew context:NULL];
コードが削除され、コールバックの内容がスイッチコードの後に移動され、問題が解決されました-コールバックを実行するために保持する必要はありません