ここでの問題は、アクセサと ivar が同じ名前であることです。これが、アンダーバー ivar 規則の由来です。ここでは、アクセサーを使用してプロパティにアクセスしていません。バッキング変数を直接使用しているため、初期化されることはありません。代わりに、常にアクセサ メソッドを使用して問題が発生しないようにしてください。managedContextObject
したがって、問題のあるメソッド (およびそのプロパティを使用するその他のメソッド) を次のように書き直します。
- (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];
}
ivar を、使用したくないものに変更したり、プロパティへのアクセスに慣れるまで、アクセサを通過していないことがすぐに明らかになるものに変更したい場合があり_managedObjectContext
ます_privateContext
。アクセサーを介して。プロパティにアクセスするための Objective-C 構文が気に入らない場合は、ドット構文を使用できますが、self
常にself.managedObjectContext
. 私はこの方法が好きではありません.人々はそれが直接のプロパティアクセスではなく、アクセサーを使用していることを忘れているので、そうでない場合は直接アクセスのドット構文を交換しても問題ないと考えています(あなたの場合のように)。