NSMutableString vs NSString的用法?

问题描述:

我对NSStringNSMutable字符串的使用感到困惑。 假设我有在课堂上宣布这样的实例变量之一,之二:NSMutableString vs NSString的用法?

NSString *one; 
NSMutableString *two; 

让我们假设我已经创建setter和使用属性他们干将。

可以说,我已经改变了我的“两化”串像这样:

 1. [two appendString:@"more string"]; 
    2. two = @"string" 
    3. self.two = @"string" 

问题:

  1. 会一号线释放以前的字符串和分配新的对象,并赋值给它。 如果是,那么这是否意味着在这种情况下创建getter和setter是不必要的?或其不必要的创造NSMutablestring

  2. 在这种情况下,性能将以前分配的字符串对象释放?

  3. 可以肯定的是,第一个对象会被释放,因为我们在这里调用setter。这是必需的代码,或者我们可以使用代码行2来分配字符串。

现在关于NSString: 如修改字符串这样也:

one = [one stringByAppendingString:@" more string"]; 
    self.one = [one stringByAppendingString:@" more string"]; 

哪个更好用NSMutablestringNSString

对不起,很长的文章,但我需要了解这些概念。

对于你的问题的第一部分:

  1. 几乎肯定不会。我预计内存将被动态分配,而不是释放和重新分配。

  2. 如果以前的答案是否定的,这也是否定的。

  3. 第二个和第三个选项甚至不与警告Incompatible pointer types assigning NSMutableString to NSString

我希望NSMutableString会在内存方面稍微更有效,因为要表示早在有效的程序可能需要内存动态。 NSString可能会被分配一个适当大小的内存块。

你的NSMutableString观点似乎是的NSString的stringBy..方法将做什么:

随着NSString及其stringBy...方法,要创建新的对象,释放旧的(如果需要的话),并使得新对象自动释放。(请注意,如果您正在从非自动释放更改为自动释放,则可能在您的释放中有一个不再需要的版本)

+0

的确是一个很好的见解。一个问题:如果我在NSString中使用stringBy方法,并且内存由运行时本身管理,那么是否需要为我的NSString创建属性?在这种情况下创建属性不必要的任务? – user1374408

+0

你打算做什么物业? –

+0

非原子,保留 – user1374408

NSMutableString将存储一些内存为NSString对象始终为常量。因此,为NSString变量重新分配新值将为新字符串分配新内存。

但是,请注意代码中的一些错误。你将不得不将消息发送到他们之前初始化的对象:

// this won't work 
NSString *one; 
[one stringByAppendingString:@"more string"]; 

// nor this 
NSMutableString *two; 
[two appendString:@"more string"]; 

// first do this: 
NSString *one = @"an initial string constant"; // or 
NSString *one = [NSString string]; 

NSMutableString *two = [NSMutableString string]; 
+1

抱歉。但是我跳过那部分代码,因为我的问题涉及到修改字符串,我认为我们可以假设那部分。 – user1374408

NSString对象是不可改变的,这意味着当你“修改”一个NSString你实际上创建一个新的字符串,而不是修改旧这是不非常有效。使用NSMutableString时,字符串保存在可以修改的缓冲区中。

所以简单的规则是,如果您需要以任何方式修改字符串,请使用NSMutableString,如果不是NSString。您也可以投一个NSMutableStringNSString而不是周围的其他方式(那么你需要做一个副本)

+0

我明白。但我想了解内心的工作和d wanted,只想学习规则而不理解他们的真实应用。反正,谢谢! – user1374408

+0

如果'NSMutableString'可以修改,'NSString'不能,那么为什么你会使用'NSString'? 'NSString'与'NSMutableString'相比有些优势吗? –

的NSString是不可变的字符串对象,这就意味着,在初始化之后,你不能改变它,的NSMutableString是可变的这意味着你可以附加另一个字符串或其他修改。

当你做[two appendString:@"more string"]时,指针仍然指向内存中的同一位置,你不必担心分配或取消分配。

当你做two = @"string"时,这意味着你的字符串指针指向内存中的一个特定位置,其中包含内含值“string”的静态字符串。

当你做self.two = @"string"时,你已经拥有一个名为two的属性了。通过在xcode中使用属性,您不必担心内存,因为您已经在属性声明中指定了内存。这是xcode提供给你的一个很好的工具,你应该尽可能地使用它。

+0

其他词:与ARC你可以使用两个NSString类,不用担心它,但在某些时候,如果更好地节省内存(像动态字符串的动态单元格),你应该使用NSMutableString。 –

的NSMutableString和NSString的之间的不同之处在于:

的NSMutableString:的NSMutableString对象提供方法来修改它们表示字符的基本阵列,而的NSString没有。例如,NSMutableString公开诸如appendString,deleteCharactersInRange,insertString,replaceOccurencesWithString等方法。所有这些方法都对字符串进行操作,因为它在内存中存在。我们可以在运行时更改字符串对象valsue。 NSString:另一方面,如果你愿意的话,只能是一次创建一次然后只读的字符串;你会发现所有的“操作”方法(substring,uppercaseString等)都会返回其他的NSString对象,并且永远不会修改内存中现有的字符串。