[英]When not to alloc and init an NSString
每當我需要創建一個新的NSString變量時,我總是分配並初始化它。 似乎有時候你不想這樣做。 你怎么知道何時分配和初始化NSString以及什么時候不?
每當我需要創建一個新的NSString變量時,我總是分配並初始化它。
不,這沒有意義。
該變量從程序遇到您聲明它的那一刻起就存在:
NSString *myString;
此變量不是NSString。 它是指向NSString的指針的存儲。 這就是*
表示的內容:該變量包含指針。
NSString 對象僅在您創建一個對象時存在:
[[NSString alloc] init];
並且指向該對象的指針僅在您在其中分配時的變量中:
myString = [[NSString alloc] init];
//Or, initializing the variable in its declaration:
NSString *myString = [[NSString alloc] init];
因此,如果你要從其他地方獲取一個字符串對象(例如, substringWithRange:
,你可以跳過創建一個新的空字符串,因為你只是要用指針替換指向空字符串的指針。另一個。
有時您確實想要創建一個空字符串; 例如,如果你要一次一個地獲取一串字符串(例如,來自NSScanner)並想要將它們中的一些或全部連接成一個大字符串,你可以創建一個空的可變字符串(使用alloc
和init
)並發送appendString:
消息來進行連接。
您還需要release
您通過alloc
創建的任何對象。 這是“ 內存管理編程指南”中的規則之一。
如果要將其初始化為已知值,使用alloc
幾乎沒有意義,可以使用字符串文字:
NSString* myStr = @"Some value";
如果你想用格式或其他東西初始化它,但不需要它超出當前的自動釋放池生命周期,使用類方便方法有點整潔:
NSString* myTempStr = [NSString stringWithFormat:@"%d", myIntVar];
如果你需要它的生命周期超過它,可以使用alloc
/ init
或者為前一個調用添加一個retain
。 我傾向於略微偏愛后者,但兩者幾乎相當。 無論哪種方式,您都需要稍后平衡release
。
請注意,由於NSString
不可變,因此這種事情不僅是不必要的,而且是主動錯誤的 :
// don't do this!
NSString* myStr = [[NSString alloc] initWithString:@""];
myStr = someOtherStr;
因為它泄漏了初始占位符值。
似乎有時候你不想這樣做。
我想不出任何時候,我會想分配/初始化一個NSString的。 由於NSStringgs是不可變的,因此您幾乎總是通過以下方法之一創建新字符串:
便利類方法,例如
NSString* foo = [NSString stringWithFormat:...];
文字
NSString* foo = @"literal";
NSString實例方法
NSString* foo = [bar uppercaseString];
從可變字符串復制
NSString* foo = [mutableBar copy]; // foo needs to be released or autoreleased in this case
我猜你指的是使用StringWithString或類似的而不是initWithString? StringWithString在你的引擎蓋下為你分配並返回一個自動釋放的字符串。
如果除了擁有字符串之外不需要進行任何字符串操作,可以使用NSString *str = @"string";
一般情況下,使用iOS,您管理內存越嚴格越好。 這意味着如果您不需要從方法返回字符串,則應該分配init然后釋放它。
如果你需要返回一個字符串,當然你需要返回一個自動釋放的字符串。 我認為它沒有那么復雜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.