在我自己的 iPhone 应用程序中,我使用了许多 nsstring 变量来存储值。但有时它的值会变得无效!有谁知道可能是什么原因?或者告诉我 nsstring 变量变为 Invalid 的情况?
5 回答
NSString
s 也是对象。它们遵循相同的内存管理规则。如果你违反了这些规则,你会得到一个指向无效内存的指针,它看起来像“无效”数据。
例如:
myString = [NSString stringWithString:@"foo"];
这将创建一个NSString*
启用了自动释放的文件。当您将其分配给 ivar 时,自动释放池将很快弹出,将保留计数恢复为 0 并dealloc
在您仍然引用它的同时对其进行操作!
淘气。
相反,要么保留它,要么使用:
myString = [[NSString alloc] initWithString:@""];
这将返回一个拥有引用。记得[myString release];
在dealloc
.
这只是糟糕的内存管理的一个例子/案例。阅读有关如何正确管理对象生命周期的文档。真的。
它们正在自动发布。如果您使用方便的方法(stringWithString、stringWithFormat)创建一个字符串,它将被添加到自动释放池中。
要停止它自动释放,请在使用完毕后向它发送一条保留消息和一条释放消息,以便释放内存。当您将字符串分配给成员变量时,您还可以设置属性以半自动执行此操作
SO和互联网上有很多关于iPhone(和Mac)内存管理的文章。谷歌自动发布。
如果这是针对资源相当有限的设备(例如 iPhone),您应该使用[[NSString alloc] init*]
静态便捷方法,因为您将减少对自动释放池的压力并降低内存使用量。每个消息循环都会耗尽池,因此要枚举的对象越少越好。
您还应该知道,除非您管理本地自动释放池,否则循环中的自动释放对象会产生大量垃圾。
您是否复制或保留了 NSString ?
我问了同样的问题。以下答案是最好的方便。只需使用:
[myString retain];
然后在 dealloc 方法中(例如 viewDidUnload):
[myString release];