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