2012-04-10 57 views
0

在這段代碼中,如果collection被釋放的類名爲init...,那麼self.titleself.managedObjectContext會發生什麼?我們不需要撥打currentCollection上的.itemName而不是collection本身?使用參數而不保留它?

- (id)initWithCollection:(AACollection *)collection { 
    if((self = [super initWithNibName:@"AACollectionViewController" 
           bundle:nil])) { 
     currentCollection = [collection retain]; 
     self.title = collection.itemName; 
     self.managedObjectContext = collection.managedObjectContext; 
    } 

感謝

+0

如果在調用這個'init'方法之前已經釋放了'collection',那麼在這個方法中根本不能使用它。它不會在這個方法中釋放,因此引用'currentCollection'或'collection'是等價的。 – trojanfoe 2012-04-10 15:30:01

+0

我建議你閱讀這個http://useyourloaf.com/blog/2011/2/8/understanding-your-objective-c-self.html – 2012-04-10 15:30:41

+0

@trojanfoe:感謝您的快速評論 – Paul 2012-04-10 15:45:29

回答

2

會發生self.title或self.managedObjectContext什麼?

您正在保留collection,所以沒有什麼不好的事情會發生。也就是說,給你的字符串屬性copy語義通常是一個好主意。例如,假設title是一個字符串屬性,如果collection.itemName碰巧給你一個可變字符串,你真的想做一個不可變的副本,以便它不會在你的鼻子下面改變(如果你只是參考可變字符串)。使用copy將爲您做到這一點。

難道我們不必在currentCollection而不是集合本身上調用.itemName嗎?

No. currentCollectioncollection將指向相同的對象。這是保留的對象,而不是指針。有些人可能會認爲使用currentCollection更好,但實際上這兩種方法都是相同的。

+0

謝謝迦勒,我現在明白了, 感謝你及時的答覆!對於你的第一點與'copy',你能解釋我多一點?你的意思是說,使用可變字符串,可以從控制器外部更改控制器標題? – Paul 2012-04-10 15:44:22

+1

@Paul如果有人給你一個指向一個可變字符串的指針,並且你存儲了這個指針,那麼你現在已經獲得了對同一個可變字符串的引用,以及其他對象(像首先給你指針的那個)可以輕鬆修改它。你通常想要的是該字符串的不可變版本。爲你的屬性指定'copy'語義會給你完全的。 – Caleb 2012-04-10 15:49:24

+0

好的謝謝! – Paul 2012-04-10 16:35:39

1

一旦你做了currentCollection = [collection retain];currentCollectioncollection指向同一個對象。因此,在該行之後,您使用哪個來訪問.itemName屬性並不重要。

+0

感謝HachiEthan的快速回答! – Paul 2012-04-10 15:44:44