1

在我自己的 iPhone 应用程序中,我使用了许多 nsstring 变量来存储值。但有时它的值会变得无效!有谁知道可能是什么原因?或者告诉我 nsstring 变量变为 Invalid 的情况?

4

5 回答 5

4

NSStrings 也是对象。它们遵循相同的内存管理规则。如果你违反了这些规则,你会得到一个指向无效内存的指针,它看起来像“无效”数据。

例如:

myString = [NSString stringWithString:@"foo"];

这将创建一个NSString*启用了自动释放的文件。当您将其分配给 ivar 时,自动释放池将很快弹出,将保留计数恢复为 0 并dealloc在您仍然引用它的同时对其进行操作!

淘气。

相反,要么保留它,要么使用:

myString = [[NSString alloc] initWithString:@""];

这将返回一个拥有引用。记得[myString release];dealloc.

这只是糟糕的内存管理的一个例子/案例。阅读有关如何正确管理对象生命周期的文档。真的。

于 2009-03-28T08:16:33.883 回答
2

它们正在自动发布。如果您使用方便的方法(stringWithString、stringWithFormat)创建一个字符串,它将被添加到自动释放池中。

要停止它自动释放,请在使用完毕后向它发送一条保留消息和一条释放消息,以便释放内存。当您将字符串分配给成员变量时,您还可以设置属性以半自动执行此操作

SO和互联网上有很多关于iPhone(和Mac)内存管理的文章。谷歌自动发布。

于 2009-03-28T07:55:35.167 回答
2

如果这是针对资源相当有限的设备(例如 iPhone),您应该使用[[NSString alloc] init*]静态便捷方法,因为您将减少对自动释放池的压力并降低内存使用量。每个消息循环都会耗尽池,因此要枚举的对象越少越好。

您还应该知道,除非您管理本地自动释放池,否则循环中的自动释放对象会产生大量垃圾。

于 2009-03-29T06:21:03.687 回答
0

您是否复制保留了 NSString ?

于 2009-03-28T07:16:46.290 回答
0

我问了同样的问题。以下答案是最好的方便。只需使用:

[myString retain];

然后在 dealloc 方法中(例如 viewDidUnload):

[myString release];
于 2011-08-22T00:13:15.037 回答