有人可以告诉我内存mgmt是需要的还是stringWithFormat是自动释放的。我查看了Apple Developer网站上的NSString类引用文档,但是如果返回字符串副本或者'msg'只是指向自动释放字符串的指针,则不能看到任何澄清。
NSString *msg; //pointer declared in interface
- (id) init
{
//some initialization code..
//is 'msg' receiving a copy or just a pointer assign
msg = [NSString stringWithFormat: @"%@ %@", FName, LName];
}
- (void) dealloc
{
//release some vars, properties here..
[msg release]; //is this correct ????
//Or should I be only doing: msg = nil;
[super dealloc];
}
答案 0 :(得分:1)
第一个问题是你声明的ivar
NSString *msg;
将丢失其值,因为根据Cocoa Memory规则[NSSTring stringWithFormat]
将返回autoreleased
个对象。规则声明任何包含alloc,new或copy的方法名称都将返回一个拥有的对象,即retain
计数为1的对象,这意味着接收者将拥有该对象,任何其他方法都将返回自动释放的对象。在你的情况下,如果你这样做:
msg = [[NSString stringWithFormat: @"%@ %@", FName, LName] retain];
现在您拥有了该对象,您可以在dealloc
中发送一条发布消息您应该只向发送保留或复制邮件的对象发送您拥有的对象,在这种情况下,因为您收到了自动释放对象,并且您没有发送保留或复制邮件,因此您不得发送它是一个发布消息。发送释放消息将导致崩溃,因为msg将指向该点的垃圾。
答案 1 :(得分:1)
如果您使用的是ARC,那么在这种情况下您根本不需要做任何事情。 ARC将为您处理它。如果您不使用ARC,那么您的代码可能会崩溃,因为msg变量将在运行循环结束时自动释放。
在非ARC案例中,您应该使用:
msg = [[NSString stringWithFormat: @"%@ %@", FName, LName] retain];
- (void) dealloc
{
[msg release];
msg = nil;
...
或者更好的是,改为使用属性。