Problem polega na tym, że accessor a Ivar mieć taką samą nazwę. Stąd bierze się podbarwna konwencja ivar. Tutaj nie używasz akcesora, aby uzyskać dostęp do twojej nieruchomości, bezpośrednio używasz zmiennej bazowej, więc nigdy się nie inicjalizuje. Zamiast tego upewnij się, że zawsze przechodzisz przez swoje metody dostępu i nie będziesz miał problemu. Więc przepisać sposób naruszające zasady (i żadnych innych, które używają właściwość managedContextObject
coś jak poniżej:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated]; // it's good practice to call the super methods, even if you're fairly certain they do nothing
// Get a reference to the managed object context *through* the accessor
NSManagedObjectContext* context = [self managedObjectContext];
// From now on, we only use this reference in this method
NSFetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Remind" inManagedObjectContext:context]; // <- use the local reference we got through the accessor
[request setEntity:entity];
NSError* error = nil;
NSArray* array = [context executeFetchRequest:request error:&error];
if(!array) {
// Do something with the error
NSLog(@"Error Fetching: %@", error);
}
[self setDesitnationsArray:[array mutableCopy]];
[destinationsTableView reloadData];
}
Możesz chcieć zmienić swoje Ivars do czegoś, czego nie będzie skłonny do używania lub że będzie natychmiast oczywiste, że nie przeszedłeś przez accessory, jak _managedObjectContext
lub nawet _privateContext
lub cokolwiek będzie trzymać się ciebie, dopóki nie przyzwyczaisz się do uzyskania dostępu do właściwości przez akcesorów. Jeśli nie podoba ci się składnia celu C w celu uzyskania dostępu do właściwości, może użyć składni kropkowej, ale musisz zawsze pamiętać, aby przejść przez self
, na przykład, self.managedObjectContext
. Nie podoba mi się ta metoda, ponieważ ludzie zapominają, że nie jest to bezpośredni dostęp do właściwości i używa akcesorów, więc uważają, że w porządku jest zamienienie składni kropkowej na bezpośredni dostęp, kiedy nie jest (jak w twoim przypadku).
Kontekst obiektu zarządzanego jest zerowy. Zakładam, że to jest ivar ... To nic nie zostało ustawione. –
Dzięki za odpowiedź. Czy możesz mi powiedzieć, jak mogę rozwiązać ten problem? – Zack
Niestety nie, bo inaczej znalazłbym odpowiedź. Musisz dodać więcej kodu, tutaj nie ma wystarczającej ilości informacji. Gdzie w kontrolce widoku ustawiasz ivar managedObjectContext? –