ログにエラーメッセージが表示される
[User Defaults] Failed to write value for key GameId in CFPrefsPlistSource<0x1740faf00> (Domain: xxx.xxxxxx, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)): Path not accessible, switching to read-only
[User Defaults] attempt to set <private> for key in <private> in read-only (due to a previous failed write) preferences domain CFPrefsPlistSource<0x1740faf00> (Domain: xxx.xxxxxx, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null))
これは何が原因ですか?
それが私がNSUserDefaults
を使用する方法です:
- (NSString *)gameId
{
if (_gameId)
return _gameId;
_gameId = [[NSUserDefaults standardUserDefaults] objectForKey:@"GameId"];
return _gameId;
}
- (void)setGameId:(NSString *)aGameId
{
_gameId = aGameId;
[[NSUserDefaults standardUserDefaults] setObject:_gameId forKey:@"GameId"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
多くの人がXcode 8でこの問題を発見しています。
「電話とホストを再起動してみてください。Xcodeが停止する場合があります。理由は、再起動のみが役立つためです。
xcode 8.1 Betaでビルドすると、同じ警告が表示されますが、値も取得できます。 」
私は同様のエラーを受け取っていました:
[User Defaults] attempt to set <private> for key in <private> in read-only (due to a previous failed write) preferences domain CFPrefsPlistSource<0x1700f5f80>
しかし、それは私がXcodeに接続されたときにのみ起こりました。
デバイスの再起動によりこれが修正されました。
同じエラーが発生しました。エラーは、同期を複数回呼び出したためです。
[userDefaults synchronize]を呼び出すと、すべてのエラーメッセージが消えます。
userDefaultを使用して拡張APPにデータを保存しようとしたときにこの問題が発生した場合は、次のコードを書いた可能性があります。[[NSUserDefaultsstandardUserDefaults] initWithSuiteName:@ "group.xxx。 com "] ;、このコードはデフォルトのuserDefaultをリセットします。実際、正しいコードは次のとおりです。[[NSUserDefaultsalloc] initWithSuiteName:@ "group.xxx.com"]; http://www.jianshu.com/p/e782104c3bc
この問題の解決策を共有したいと思います。私の場合、エラーは正当なエラーであり、データは適切に保存されませんでした。 NSUserDefaultsがループ内に「データを保存」していることが原因でエラーが発生したことがわかりました。
「データ保存」とは、これを意味します(擬似コード):
loop{
[defaults setObject:@"Data" forKey:@"Key"];
[defaults synchronize];
}
したがって、コードはこれを非常に高速に複数回実行し、問題を引き起こします。 「同期」は同時呼び出しを処理できないと思います。
何をする必要があります:
loop{
[defaults setObject:@"Data" forKey:@"Key"];
}
[defaults synchronize];
同期は、すべてのオブジェクトが設定された後に1回呼び出されます。
アプリを削除し、Xcodeで再度インストールしました。 XCode 8.2.1の使用。