2014-04-30 26 views
-1

下面的代碼是從蘋果公司的核心數據模板,但我見過類似的代碼,從許多不同的開發商:將屬性複製到用於方法的「新鮮」變量中的邏輯是什麼?

- (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

沒有創建「新對象」。它只是一個變量,它包含一個指向現有對象的指針。 –

回答

2

A.正如你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的答案中提到的原因(在這種情況下,這還不夠,我們談論的是保存,這意味着磁盤訪問和方法調用不會以相關方式更改性能),還有一個不同的原因:代碼可讀性

1:使用第二個參考變量的優點是代碼更緊湊。它更簡單,更容易忽視。

2:使用第二個參考變量的優點是您可以獲得新標籤。使用諸如oldContextnewContextbackgroundContextmainContext或$ whatever這樣的var名稱可以使讀者輕鬆遵循複雜算法中的數據流。

+0

有了理由1和緊湊性,你只是指用來表示變量的字符數量? –

+0

1.您是否想說:「用於表示*值*的字符數量」?我假設如此。 2.我指人的理解。從任何定義你都知道:你可以在任何地方用定義上下文替換定義的術語。但是使用定義的術語更加緊湊並且更容易理解人類。 –

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個

相關問題