NSString stringWithFormat和Memory Mgmt

时间:2012-10-02 15:23:19

标签: objective-c memory-management

有人可以告诉我内存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];
}

2 个答案:

答案 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;
   ...

或者更好的是,改为使用属性。