2017-01-20 14 views
5

Właśnie zauważyłem, że klucz, który istnieje w moim **NSUserDefaults** powraca dość często. Wygląda na to, że jest o połowę krótszy, a druga połowa jest nieprawidłowa. Mówię to za połowę czasu, ale nie oznacza to, że jego flip-flopowanie, to tylko 40-50%, to nie działa. Po zapisaniu wartości początkowej natychmiast wywoływana jest synchronizacja. Używam tego klucza jako aplikacji, którą ustawiam, gdy nowy użytkownik zarejestruje się.NSUserDefaults objectForKey czasem zero

Poniższe powraca kod nil:

#define kDBrevision @"revision" 

NSString *rev = [[NSUserDefaults standardUserDefaults] objectForKey:kDBrevision]; 

Kiedy uruchomić aplikację i po prostu monitorować wartość (bez pisanie żadnych NSUserDefaults), wartość czasami jest ważny bez modyfikacji do NSUserDefaults na wszystkich.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSString *r = [[NSUserDefaults standardUserDefaults] objectForKey:kDBrevision]; 
    NSLog(@"revision %@", r); 
    _exit(1); 

Nie mam pojęcia, dlaczego tak się dzieje. Im działa iOS 10 na moim urządzeniu podłączonym do Xcode 8.2.1. Ktoś ma jakieś pomysły? Dzięki

EDIT: zacząłem rozmawiać z jabłkiem o ustalenie to i okazało się, że jeśli masz plik pełna ochrona włączona, może być przyczyną tego problemu pojawiać się od czasu do czasu, jednak jabłko powiedział mnie, że mój konkretny przypadek (który jest jedynym, którego byłem pewien w tym momencie) jest błędem. Sprawa ma miejsce, gdy używasz Xcode do uruchomienia aplikacji na urządzeniu, które powinno być nie może się nie udać, a czasami się zdarza. Nie mam pojęcia, kiedy i czy zostanie naprawiony. Zamiast tego przestawiłem moje ciągi krytyczne z domyślnych na zamiast tego na pęku kluczy.

+1

Prawdopodobnie trzeba sprawdzić, czy zapisać zerowa wartość do swojego 'NSUserDefault', nie ma to jak połowa prawidłowe połowa czasu źle w kodzie, jego na kodzie tylko – Tj3n

+0

Czy pominąłeś [[NSUserDefaults standardUserDefaults] zsynchronizował] podczas ustawiania? – KSR

+0

Sprawdziłem, że nie piszę nic. I tak, kiedy piszę nową wartość, nazywam syncrhonize. – Tim

Odpowiedz

5

Wygląda na to, że jest to błąd Xcode 8 i/lub iOS 10. Wpadłem na to sam i ostatecznie zawęziłem sprawę do UserDefaults sporadycznie zwracając zero, gdy w rzeczywistości były dane dla klucza. W szczególności, ustawiłem dane raz, a następnie usunąłem logikę zestawu i wykonałem tylko logikę pobierania, wielokrotnie, a czasami otrzymałem wartości, czasami otrzymałem zero.

Zmieniłem swój schemat Run, aby korzystać z konfiguracji Release i uruchomiłem aplikację na urządzeniu bez dołączonego debuggera, a problem zniknął, to znaczy logika "get" wygenerowała poprawną wartość za każdym razem, gdy ją wykonałem (~ 30 razy).

Oto kilka dyskusja:

iOS 10 with XCode 8 GM caused NSUserDefaults to intermittently not work

iOS 10, NSUserDefaults Does Not Work

https://forums.developer.apple.com/thread/48700

https://forums.developer.apple.com/message/143155#143155

0

try poniżej kod w didFinishLaunchingWithOptions

Swift 3.0

UserDefaults.standard.synchronize() 

Obective - C

[[NSUserDefaults standardUserDefaults] synchronize];