1

次のシナリオでメモリ管理について少し混乱しています

-(NSData *)getData{ 
    NSData *TempData = [[NSData alloc]init];
    return TempData; 
  }

 //in some other method
 NSData *NewData = [self getData];

ここで問題となるのは、NewDataがいつ保持されるのか、どのようにリリースすればよいのかということです。

4

4 に答える 4

2

コードをから変更します

-(NSData)getData{ 
    NSData *TempData = [[NSData alloc]init];
    return NSData; 
 }

-(NSData)getData{ 
    NSData *TempData = [[NSData alloc]init];
    return [TempData autorelease]; 
 }

またはコードだけでリリースします

[NewDate release];

問題はゲッターメソッドにあると思います。保持したTempDataは返されません。

于 2012-06-29T10:22:44.937 に答える
1

[newData release]を呼び出すまで存続します。メソッドは、割り当てのために保持coutが1のオブジェクトを返します。これは、ココアメモリ管理ルールに従って、メソッドがnewまたはallocで開始するか、コピーを含む必要があることを意味します。そのため、メソッド名をnewDataに変更します。

于 2012-06-29T10:25:37.823 に答える
1

releaseオブジェクトが完成したら、電話するだけです。

-(NSData *)newData{ 
    NSData *TempData = [[NSData alloc]init];
    return TempData; 
}

//in some other method
NSData *NewData = [self newData];

// use data

[NewData release];

編集:規則に準拠するために、保持されたオブジェクトを返すメソッドは。で始まる必要がありnewます。@PeterSarnowskiに感謝します。

于 2012-06-29T10:22:18.130 に答える
1

これは、このゲッターメソッドの誤った使用法です。NSDataの自動リリースされたコピーを返す必要があります。自動解放されたコピーは、呼び出し元によって保持される場合と保持されない場合があります。それが保持されている場合、それを解放するのは発信者の責任です。

次に、このメソッドの見返りとしてのタイプミスです。NSData*である必要があります。見返りに私のタイプミス。ポインティングしてくれたPeterSarnowskiに感謝します。

-(NSData *)getData { 
    NSData *tempData = [NSData data];
    return tempData; 
}

呼び出し元は、次のコードを使用してそれを保持できます。

NSData *myData = [[self getData] retain];
//Some code

[myData release];

発信者がこのオブジェクトを保持することに興味がない場合、彼はただ電話します

NSData *myData = [self getData];

呼び出された場所から同じ関数内で使用します。

于 2012-06-29T10:23:51.263 に答える