代码之家  ›  专栏  ›  技术社区  ›  user2825086

NSString和NSMutabbleString内存注意事项

  •  3
  • user2825086  · 技术社区  · 12 年前

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

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

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

    谢谢五、

    2 回复  |  直到 12 年前
        1
  •  2
  •   Antonio    12 年前

    NSString s可以包含字符串文本(编译时常量)和字符串对象(在运行时动态实例化)。

    万一 字符串 ,没有动态实例化,因此它们不会在运行时影响内存。将文字值分配给 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字符串 实例,如果不再被引用,将被释放,因为未被使用。这是自动处理的,因此不能从代码中执行任何操作。

    也许您对新实例和旧实例在某些时候使用内存这一事实更感兴趣,但在释放未使用的实例之前,这是暂时的。

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

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

        2
  •  1
  •   Tancrede Chazallet    12 年前

    原件 NSString 将由系统释放,因此不会造成任何泄漏。