2011-03-08 70 views
0

我使用UISearchBar,和它的一個屬性,text,聲明如下:我應該發佈@property(非原子,複製)嗎?

摘要:當前或開始搜索文本。
宣言@property(nonatomic, copy) NSString *text;

我知道規則是釋放你用什麼都+alloc+new-copy

我所做的:

NSString *searchText = searchBar.text; 

和:

[searchText release]; 

而且我得到了一個很好的EXC_BAD_ACCESS消息。當我刪除發行版時,EXC_BAD_ACCESS消息停止顯示,所以我認爲它是eror源。

問題:我不應該發佈searchText,因爲它來自使用副本的屬性嗎?

回答

8

不,你不應該在這裏使用版本。在這種情況下的「副本」是指如何執行setter,而不是getter。您撥打-text)不包含單詞「複製」,因此您不應該發佈結果。

+0

嗯,但是......如果它將被獲取('get''ed?),它一定是在某處設置的。我不認爲這是真正的答案。真正的問題是:'copy' setter語義是否保留了與''retain''一樣的方式,與'-copy' NSObject方法一致,答案是沒有它不會,它說的是做一個獨特的副本,它'分配'。 – 2011-03-08 16:09:34

+0

@Dan Ray,它可能會也可能不會創建一個指定的唯一副本。它可能會做很多事情。如果目標對象不可變,它可能會保留。它可能會創建一個完全不同類型的對象,與通過的對象幾乎沒有共同之處(我在C++包裝器中做了很多)。 「copy」是調用者的提示,如果你讓setter由@synthesize創建,則提供默認實現。但問題是是否要調用-release來查找-searchText的結果,答案是否定的。 – 2011-03-08 17:11:56

+0

謝謝。得到它了。 +1的解釋。 – ofirbt 2011-03-09 09:05:03

2

該屬性的複製屬性意味着該對象在之前被複制到的實例變量。當您訪問此屬性時,您將獲得對所做副本的引用。

當您設置的搜索欄的文本:

NSString* myTextString = [[NSString alloc] initWithString:@"My Text String"]; 
mySearchBar.text = myTextString; 
[myTextString release]; 
+0

做**不**使用'retainCount'。代碼很好,直到最後一行。如果您要真正運行該代碼,則保留計數將爲-1(具體取決於實施細節)。 – bbum 2011-03-08 17:26:58

+0

閱讀Rob Napier的回答後刪除了最後一行。謝謝! – 2011-03-08 17:40:31

+0

酷 - 謝謝 - 我建議刪除評論。在此之後對象是否被銷燬 - 這完全是「mySearchBar」的實現細節,而不是調用者應該考慮的事情。 – bbum 2011-03-08 18:21:00

1

爲了詳細說明羅布納皮爾的正確答案:

NSString *searchText = searchBar.text; 

此代碼分配到的searchBarsearchText text屬性的參考。這不是searchText的副本,只是另一個參考searchBar對象中相同的NSString對象。發佈searchText與發佈searchBar.text相同,這會導致您的EXC_BAD_ACCESS消息。

在此聲明中的文本屬性,getter方法只是:

- (NSString *)text { 
    return text; 
} 

更有趣的方法是setter方法。對於這個聲明,setter類似於:

- (Void)setText:(NSString *)newString { 
    if (text != newString) { 
    [text release]; 
    text = [newString copy]; 
    } 
} 
相關問題