0

ここでは、「test」メソッドで「tempString」の自動解放を使用しました。ルールに従って、メインで「[一時保持]」を使用する必要があります。しかし、私はそれを使用しませんでした。それでも問題なく動作し、出力を印刷します。では、「保持」の必要性は何ですか?誰でも理由を教えてもらえますか?前もって感謝します。

-(NSMutableString *) test : (NSMutableString *) aString{

 NSMutableString *tempString=[NSMutableString  stringWithString:aString];

 [tempString appendString:@" World"];

  return tempString;}

int main (){

 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

 MemoryMgmt *memoryMgmt=[[MemoryMgmt alloc] init ];
 NSMutableString *str1 =@"Hello";

 NSMutableString *temp = [memoryMgmt test: str1];

 NSLog(@" %@",temp);

 [pool drain];
 return 0;
}
4

3 に答える 3

4

stringwithStringautoreleased を返す必要NSMutableStringがありますが、実際にはNSAutoReleasePool排水されるまで解放されません。プールがまだオブジェクトを保持している間にオブジェクトを使用し、その後はプールを空にしてオブジェクトを解放します。

自動解放されたオブジェクトをどこかから受け取った場合、現在の変数スコープを超えてオブジェクトを追跡する場合にのみ、それを保持する必要があります。オブジェクトを保持する場合でも、参照が範囲外になる場合 (現在の関数呼び出しが完了した後など)、オブジェクトがリークします。

ここで行っていることは、参照をtempどこにも保持していないため、ローカルスコープ内にあるため、実際には正しいです。

于 2010-09-30T13:40:35.920 に答える
0

これは、ツールの実行が終了するまで自動解放プールが空にならないために機能します。ただし、実際には正しい使用法です。呼び出し元に所有権を渡していると主張しないメソッドから自動解放されたオブジェクトを返します。一部の人々はします

return [[tempString retain] autorelease];
于 2010-09-30T13:42:48.507 に答える
0

オブジェクトを自動解放すると、プールがドレインまたは解放されたときに実行ループの最後に解放されます...あなたの場合、新しいスレッドを開始するため、自動解放プールを管理しますが、文字列 temp はしませんプールを空にするまで解放するため、それを使用しても有効です...お役に立てば幸いです

于 2010-09-30T13:40:32.787 に答える