【问题标题】:NSString and NSMutableString memory considerationsNSString 和 NSMutableString 内存注意事项
【发布时间】:2014-03-28 00:03:36
【问题描述】:

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

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

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

谢谢! V

【问题讨论】:

  • 有趣的是,没有人解决可变性(NSMutableString),这是问题的关键部分。
  • @Zaph 毫无疑问NSMutableString :)
  • 标题和第一句中都有“NSMutableString”这个词。我错过了什么?

标签: ios objective-c memory-management nsstring


【解决方案1】:

原来的NSString会被系统释放,不会造成任何泄露。

【讨论】:

  • 与任何对象一样,不仅仅是NSStrings。边漫无边际:这就是为什么 ARC 对新手不太好。要充分发挥魔法的潜力,必须了解其背后的深层根源。
  • 这在某些情况下是正确的,在其他情况下是不正确的。
  • @Cyrille 我认为您陷入了假设您的知识水平是每个人都需要的基础的陷阱。这不是真的。大多数人,也许包括你,都不知道操作系统实际是如何分配内存的,上面是 malloc/calloc/realloc 的工作方式,下面是 CPU 缓存和虚拟内存的实现方式。甚至 MRR 也拥有许多通常没有必要的神秘知识。我经常在新手中看到这一点(对我来说,这是一个拥有不到 20 年软件开发经验的人,足以看到“必须知道”变成“不必要知道”)。
  • @Zaph “必须知道”变成“没必要知道”我喜欢它:D
  • @Zaph:鉴于这里有大量问题是基于对保留计数工作原理的混淆,我认为您对“每个需求的基础”在哪里过于乐观。很明显,许多人仍在编写 MRR 程序——我们甚至不知道 OP 不是其中之一。
【解决方案2】:

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

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

NSString *myString = @"string1";

然后分配另一个字面值

myString = @"string2";

对可用内存量没有任何改变。

如果是字符串对象,内存确实会发生变化。如果你有一个NSString 类型的变量,并给它分配一个动态字符串,比如

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

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

如果稍后你分配一个新的动态值

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

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

使用 ARC 时,虽然第一个 NSString 实例如果不再被引用,将因为未使用而被释放。这是自动处理的,因此无需从代码中执行任何操作。

也许您对新旧实例有时会使用内存这一事实更感兴趣——但这只是暂时的,直到未使用的实例被释放。

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

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

【讨论】:

  • 字符串文字实际上不会导致分配。与数组、字典和 NSNumber 字面量不同,NSString 字面量实际上是编译时常量。
  • 我对更新和修复感到困惑。为什么你要避免使用字符串文字?我会积极寻求使用它。其次,我们将如何使用字符串文字?在 Java 中,我会写 String s = "foobar"; 来使用字符串文字(好主意),我会写 String s = new String("foobar"); 来创建一个新实例(坏主意)。
  • @Gonzalo:如果你试图演示对象分配,你会想要避免使用字符串文字,因为字符串文字不分配任何东西。
  • 同意。不过,在涉及内存考虑的问题的上下文中,我希望我们希望尽可能使用字符串文字。
  • @Gonzalo 提出了一个问题,我同意我的回答方式会引起混乱。我将修改我的答案以更清楚地解释这两种情况
猜你喜欢
  • 2016-08-30
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多