我试图围绕NSString和NSMutableString,以及它们如何影响内存。
在我的研究中,我得出结论,如果我创建一个NSString对象并给它一个值,那么稍后更改该值,原始对象将被另一个替换为新值。
我的问题是,在更改NSString的值的情况下。当更改NSString的值并且指向的对象被新对象替换时,原始对象会发生什么?这是内存泄漏吗?
谢谢! V
答案 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
将由系统释放,因此不会导致任何泄漏。