NSString和NSMutableString内存注意事项

时间:2014-02-25 16:06:43

标签: ios objective-c memory-management nsstring

我试图围绕NSString和NSMutableString,以及它们如何影响内存。

在我的研究中,我得出结论,如果我创建一个NSString对象并给它一个值,那么稍后更改该值,原始对象将被另一个替换为新值。

我的问题是,在更改NSString的值的情况下。当更改NSString的值并且指向的对象被新对象替换时,原始对象会发生什么?这是内存泄漏吗?

谢谢! V

2 个答案:

答案 0 :(得分:2)

NSString可以包含字符串文字,它们是编译时常量,而字符串对象则是在运行时动态实例化的。

如果是字符串文字,则没有动态实例化,因此它们不会在运行时影响内存。将文字值分配给NSString变量

NSString *myString = @"string1";

然后分配另一个文字值

myString = @"string2";

不会对可用内存量进行任何更改。

如果字符串对象,则内存确实会发生变化。如果您有NSString类型的变量并为其指定动态字符串,例如

NSString *myString = [NSString stringWithFormat:@"String %d", 1];

分配一个新的NSString实例,使用提供的字符串进行初始化,并分配给myString变量。

如果稍后您分配新的动态值

myString = [NSString stringWithFormat:@"String %d", 2];

创建了一个新的NSString实例,但它并不替换旧的实例。两者都在实例化和内存中。

在第一个NSString实例中使用ARC时,如果不再引用,将因未使用而被释放。这是自动处理的,因此不必从代码中完成任何操作。

也许您对以下事实更感兴趣:新旧实例在某些时候使用内存 - 但这是暂时的,直到释放未使用的实例。

要回答您的疑虑,不,没有内存泄漏。字符串文字在整个应用程序生命周期中都会持续存在,因为它们是常量。分配和释放(释放)字符串对象,ARC自动处理解除分配。

当然这是一个适用于任何动态实例化类的一般概念,而不仅仅是NSString - 但不适用于原始数据类型(int,boolean,float等),因为这些变量types保存实际值,而不是指向值所在的内存区域的指针。如果您想知道,原始数据类型不会产生内存泄漏。

答案 1 :(得分:1)

原始NSString将由系统释放,因此不会导致任何泄漏。