以下代码来自Apple的核心数据模板,但我看到了许多不同开发人员的类似代码:
- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
为什么为managedObjectContext
创建了新对象?为什么self.managedObjectContext
不够。就个人而言,我本来就会用到它。
当你可以简单地使用属性时,将属性复制到一个新的局部变量的逻辑是什么?
答案 0 :(得分:4)
我认为这是因为当你致电self.managedObjectContext
时,你真正打电话给[self managedObjectContext]
通过暂时将其分配给变量,我们可以使用该值而无需一遍又一遍地遍历代码。大多数时候,它可能不会成为一个巨大的问题,但总的来说,它可能更快。
否则,您必须
if (self.managedObjectContext != nil) {
if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
调用[self managedObjectContext]
3次而不是1次
答案 1 :(得分:2)
一个。正如您对Q的评论中所提到的,没有新对象。你应该真正理解(Objective-C)对象和对象指针之间的区别。在我的书中,我通常使用下面的代码来解释:
// Copy reference
NSMutableString *ref1 = [@"Amin" mutableCopy];
NSMutableString *ref2 = ref1;
[ref1 appendString:@" Negm"];
NSLog( @"%@ / %@", ref1, ref2 );
你会得到
$ Amin Negm / Amin Negm
什么?两个对象都变了?不,只有一个对象和两个指针。如果使用一个指针更改一个对象,则即使使用第二个指针对其进行寻址也是一个已更改的对象。 I. e。这是声明属性的strong
和copy
之间的语义差异。
要拥有两个对象,您必须显式复制第一个对象:
// Copy reference
NSMutableString *ref1 = [@"Amin" mutableCopy];
NSMutableString *ref2 = [ref1 mutableCopy];
[ref1 appendString:@" Negm"];
NSLog( @"%@ / %@", ref1, ref2 );
在这种情况下,对象ref1
指向被复制,因此我们有两个对象,然后对新对象的引用被分配给ref2
。在这种情况下,您有两个不同的对象,您将获得预期的结果:
$ Amin Negm / Amin
B中。为什么要将引用分配给新的var? 除了Logan的答案中提到的原因(在这种情况下还不够,我们讨论的是保存,这意味着磁盘访问和方法调用不会以相关的方式改变性能),还有一个不同的原因:代码可读性< / p>
1:使用第二个参考var具有代码更紧凑的优点。它更短,更容易被忽视。
2:使用第二个参考var具有获得新标签的优势。使用诸如oldContext
和newContext
或backgroundContext
和mainContext
或$之类的var名称可以使读者轻松地遵循复杂算法中的数据流。