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 に答える