簡體   English   中英

什么時候不分配和初始化NSString

[英]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)並想要將它們中的一些或全部連接成一個大字符串,你可以創建一個空的可變字符串(使用allocinit )並發送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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM