gpt4 book ai didi

ios - NSString 和 NSMutableString 内存注意事项

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:31 26 4
gpt4 key购买 nike

我正在努力思考 NSString 和 NSMutableString,以及它们如何影响内存。

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

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

谢谢! V

最佳答案

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 时,如果不再引用,将因为未被使用而被释放。这是自动处理的,因此无需通过代码执行任何操作。

也许您对新旧实例有时会使用内存这一事实更感兴趣 - 但在未使用的实例被释放之前这是暂时的。

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

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

关于ios - NSString 和 NSMutableString 内存注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22019727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com