2012-03-05 35 views
0

我應該一般總是保留還是複製從函數返回的字符串值?我是否應該總是複製或保留從函數返回的字符串

請看下面的例子:如果我想去上和功能使用的myString沒有它得到釋放我怎麼處理呢

- (NSString*) getString: 
{ 
    return [[NSString alloc] autorelease]; 
} 

- (NSString*) getStringAlloc: // Not sure if this convention is correct 
{ 
    return [NSString alloc]; 
} 

... 

在調用方法

NSString* myString = [self getString]; 

。第二種方法的名稱也是使用正確的約定。

如果我知道返回的字符串是自動釋放(來自方法名稱)並且沒有被更改,那麼推測可能是保留或複製的唯一原因是有人在將來不會更改代碼。如果我不介意價值發生變化,那麼我估計不需要保留或複製。

假設我沒有使用ARC。

回答

3

不!創建對象的範圍(在這種情況下,您的方法爲「getString」)也負責釋放它!所以第一種方法是唯一有效的方法。

另外getter-methods沒有按照慣例以「get」作爲前綴。所以該方法應改爲- (NSString*) string

+2

也考慮使用ARC。 – calimarkus 2012-03-05 16:40:18

+0

這裏有一篇關於ARC特性jaydee3所指的好文章:http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/ – allaire 2012-03-05 16:42:16

+0

更新後的問題。 – zode64 2012-03-05 16:42:16

1

你的習慣是C++,但是如果你打算使用Cocoa,那麼你可能就是所有的Cocoa。使用init,get,set作爲方法的前綴在Objective C中有特殊的含義,因此瞭解它們很重要。基本上,如果你創建一個NSString,它將被保留(即你用一個init函數創建它)或自動釋放(即你用一個沒有init或copy的方法創建它)。如果它是自動發佈的,則可以在函數中使用它,直到函數結束,然後將在將來某個時候發佈。如果它被保留,你必須釋放它。 ARC會爲你管理這些,但你仍然需要了解iOS內存管理的基礎知識才能獲得成功。你真的需要閱讀:

Apple Memory Mangement Guide

+0

是這樣的,我可以在調用函數中使用它,在我的情況下包含'NSString * myString = [self getString];'? – zode64 2012-03-05 16:53:22

+0

你的getString方法不好。你正在分配一個NSString *,但你沒有調用init,所以它不會是一個有效的字符串。 NSString有實例方法(以連字符開頭,類方法以加號開頭,類方法通常返回自動發佈的字符串,見上面的示例) – 2012-03-05 20:01:51

1

如果使用自動釋放,你的字符串將不會被釋放,直到「內部嵌套自動釋放池將被榨乾」。如果你創建了一個自動釋放池,你很可能不會讀這個,所以我們假設我們有系統的自動釋放池。當它沒有其他事情要做時,它會將它們排空(即刪除標記爲自動釋放的對象),但總是在事件週期結束時。這意味着如果你將自動釋​​放對象賦值給一個局部變量,你可以確定它將保留在局部變量的整個範圍內。但是,當您將autorelease變量分配給類成員時,您應該注意,在這種情況下,它可以被刪除,直到下次訪問它爲止。避免這種情況的最好方法是使用保留類型屬性。

+0

所以我可以假設'MyString'將會在包含賦值的函數'(NSString * myString = [self getString];)' – zode64 2012-03-05 16:57:13

+0

但是不要使用「get ...」:P – MrTJ 2012-03-05 17:07:27

+0

如果我從該方法返回它,我從文檔中理解 – zode64 2012-03-05 17:13:08

1

首先,如果你可以,你應該使用ARC。 ARC將大部分內存管理帶離開發者。我說的大部分都不是全部,因爲如果你使用的是核心圖形框架,你必須自己釋放對象。

你也應該考慮使用自動釋放過載NSString的對象象下面這樣:

NSString *someString = [NSString stringWithFormat:@"Hello World"]; 

NSString的stringWithFormat方法會返回一個自動釋放的對象。

相關問題