我正在本书的帮助下学习核心数据。有一个代码:
- (void)loadData {
// Pull the movies. If we have 200, assume our db is set up.
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Movie"
inManagedObjectContext:context]];
NSArray *results = [context executeFetchRequest:request error:nil];
if ([results count] != 200) {
// Add 200 actors, movies, and studios
for (int i = 1; i <= 200; i++) {
[self insertObjectForName:@"Actor" withName:
[NSString stringWithFormat: @"Actor %d", i]];
[self insertObjectForName:@"Movie" withName:
[NSString stringWithFormat: @"Movie %d", i]];
[self insertObjectForName:@"Studio" withName:
[NSString stringWithFormat: @"Studio %d", i]];
}
// Relate all the actors and all the studios to all the movies
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Movie"
inManagedObjectContext:context]];
NSArray *results = [context executeFetchRequest:request error:nil];
for (NSManagedObject *movie in results) {
[request setEntity:[NSEntityDescription entityForName:@"Actor"
inManagedObjectContext:context]];
NSArray *actors = [context executeFetchRequest:request error:nil];
NSMutableSet *set = [movie mutableSetValueForKey:@"actors"];
[set addObjectsFromArray:actors];
[request setEntity:[NSEntityDescription entityForName:@"Studio"
inManagedObjectContext:context]];
NSArray *studios = [context executeFetchRequest:request error:nil];
set = [movie mutableSetValueForKey:@"studios"];
[set addObjectsFromArray:studios];
}
}
[request release];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
主要问题是:如果上下文中有任何更改,是否有必要更新上下文指针? 我的意思是:我在方法的开头得到指向上下文的指针,然后在循环中我接受这个上下文并在那里插入托管对象(-insertObjectForName:withName :)。然后我看到这个上下文指针的更新并且有这个问题:它是某种规则,我应该采取相同的行动,或者它只是不那么整洁的代码示例?为什么我不能使用旧指针?
---编辑---还有一个问题:这是在代码中合法初始化请求:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
...
NSFetchRequest *request = [[NSFetchRequest alloc] init];
...
[request release];
两个分配,只有一个版本?
答案 0 :(得分:0)
在我看来
它只是不那么整洁的代码示例
关于你的第二个问题:还有两个版本!否则你有泄漏。
答案 1 :(得分:0)
我也有这本书并且查了一下。
显然对我来说似乎是一个错字,并没有多大意义。
只需忽略该行并继续 - 它应该可以正常工作。
答案 2 :(得分:0)
这是一些非常难看的代码。
此:
NSManagedObjectContext * context = [self managedObjectContext];
...可能只是因为他们希望能够在方法调用而不是context
中编写self.managedObjectContext
。
使用: NSFetchRequest * request = [[NSFetchRequest alloc] init];
......允许两次,但这是懒惰的不良做法。任何变量在范围内只应命名一次。实际上,编译器将使用此代码生成警告。它会泄漏,因为每个init
必须由release
平衡。