0

有人可以告诉我需要内存管理或 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];
}
4

2 回答 2

1

那么第一个问题是你声明的 ivar

NSString *msg;

会失去它的价值,因为[NSSTring stringWithFormat]根据 Cocoa Memory 规则会返回一个autoreleased对象。该规则规定,任何包含 alloc、new 或 copy 的方法名称都将返回一个拥有的对象,即retain计数为 1 的对象,这意味着接收者将拥有该对象,任何其他方法都将返回一个自动释放的对象。在你的情况下,如果你这样做了:

msg = [[NSString stringWithFormat: @"%@ %@", FName, LName] retain];

现在您拥有该对象,您可以在 dealloc 中向其发送释放消息

您应该只向您拥有的对象发送释放,即向您发送保留或复制消息的对象,在这种情况下,因为您收到了一个自动释放对象,并且您没有发送保留或复制消息,因此您不能向它发送释放信息。发送释放消息将导致崩溃,因为此时 msg 将指向垃圾。

于 2012-10-02T15:27:34.347 回答
1

如果您使用的是 ARC,那么在这种情况下您根本不需要做任何事情。ARC将为您处理。如果您不使用 ARC,那么您的代码可能会崩溃,因为 msg 变量将在运行循环结束时自动释放。

在非 ARC 情况下,您应该使用:

msg = [[NSString stringWithFormat: @"%@ %@", FName, LName] retain];

- (void) dealloc
{
   [msg release];
   msg = nil;
   ...

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

于 2012-10-02T15:27:45.040 回答