将属性复制到" fresh"中的逻辑是什么?变量用于方法?

时间:2014-04-30 03:54:50

标签: ios objective-c cocoa-touch

以下代码来自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不够。就个人而言,我本来就会用到它。

当你可以简单地使用属性时,将属性复制到一个新的局部变量的逻辑是什么?

2 个答案:

答案 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。这是声明属性的strongcopy之间的语义差异。

要拥有两个对象,您必须显式复制第一个对象:

// 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具有获得新标签的优势。使用诸如oldContextnewContextbackgroundContextmainContext或$之类的var名称可以使读者轻松地遵循复杂算法中的数据流。