Ios Pro Core数据手册,示例代码问题

Ios Pro Core数据手册,示例代码问题,ios,core-data,Ios,Core Data,我在书的帮助下学习核心数据。有一个代码: - (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:[NSEntityD

我在书的帮助下学习核心数据。有一个代码:

- (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();
}
}
两个allocs和一个版本?

在我看来

这只是一个不太整洁的代码示例


关于你的第二个问题:必须有两个版本!否则你就有漏洞了。

我也有这本书并查过了

对我来说,这显然是一个拼写错误,没有多大意义


忽略这一行并继续-没有它应该可以正常工作。

这是一些非常糟糕的代码

这:

NSManagedObjectContext*上下文=[self-managedObjectContext]

。。。可能只是因为他们希望能够在方法调用中编写
context
,而不是
self.managedObjectContext

使用: NSFetchRequest*request=[[NSFetchRequest alloc]init]


。。。允许两次,但这是懒惰的坏习惯。任何变量在一个范围内只能命名一次。事实上,编译器将使用此代码生成警告。它将泄漏,因为每个
init
都必须通过
版本进行平衡

那么,我应该重新创建请求和结果数组吗?或者他们会接受旧的指针?我刚从图书网站下载了源代码并删除了那些行。它对应用程序没有影响。这可能只是一个打字错误。那本书上也没有勘误表。。。因此,为了澄清关于请求和结果数组的那一刻:我是否应该再次发出请求以获得新的结果数组?请求在发布前是否完好无损?所以我可以调用“[context executeFetchRequest:request error:nil];”使用旧的初始化指针?是的,您可以再次自由使用相同的请求。它只有在发布后才会被丢弃——在发布之前,你可以随时使用它。是的,我倾向于这样认为。我对他们的代码有很多问题,但是我认为内存管理和编程的其他方面并不是本书的目的。对核心数据事项没有任何疑问。:)非常感谢。我也有同感
NSFetchRequest *request = [[NSFetchRequest alloc] init];
...
NSFetchRequest *request = [[NSFetchRequest alloc] init];
...
[request release];