web-dev-qa-db-ja.com

ログのNSUserDefaultsエラー

ログにエラーメッセージが表示される

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

多くの人がXcode 8でこの問題を発見しています。

「電話とホストを再起動してみてください。Xcodeが停止する場合があります。理由は、再起動のみが役立つためです。

xcode 8.1 Betaでビルドすると、同じ警告が表示されますが、値も取得できます。 」

参照: https://forums.developer.Apple.com/thread/51348

29
Tushar

私は同様のエラーを受け取っていました:

[User Defaults] attempt to set <private> for key in <private> in read-only (due to a previous failed write) preferences domain CFPrefsPlistSource<0x1700f5f80>

しかし、それは私がXcodeに接続されたときにのみ起こりました。

デバイスの再起動によりこれが修正されました。

2
Lee Probert

同じエラーが発生しました。エラーは、同期を複数回呼び出したためです。

[userDefaults synchronize]を呼び出すと、すべてのエラーメッセージが消えます。

1
Milander

userDefaultを使用して拡張APPにデータを保存しようとしたときにこの問題が発生した場合は、次のコードを書いた可能性があります。[[NSUserDefaultsstandardUserDefaults] initWithSuiteName:@ "group.xxx。 com "] ;、このコードはデフォルトのuserDefaultをリセットします。実際、正しいコードは次のとおりです。[[NSUserDefaultsalloc] initWithSuiteName:@ "group.xxx.com"]; http://www.jianshu.com/p/e782104c3bc

1
H u Y an g

この問題の解決策を共有したいと思います。私の場合、エラーは正当なエラーであり、データは適切に保存されませんでした。 NSUserDefaultsがループ内に「データを保存」していることが原因でエラーが発生したことがわかりました。

「データ保存」とは、これを意味します(擬似コード):

loop{
    [defaults setObject:@"Data" forKey:@"Key"];
    [defaults synchronize];
}

したがって、コードはこれを非常に高速に複数回実行し、問題を引き起こします。 「同期」は同時呼び出しを処理できないと思います。

何をする必要があります:

loop{
    [defaults setObject:@"Data" forKey:@"Key"];
}
[defaults synchronize];

同期は、すべてのオブジェクトが設定された後に1回呼び出されます。

0
GeneCode

アプリを削除し、Xcodeで再度インストールしました。 XCode 8.2.1の使用。

0
sigrem