1

からオブジェクトdataWithBytesNoCopy:length:を作成するためのメソッドを使用しています。 NSDatabytes

-(NSData *)dataFromBytes
{ 
...
   void *data = malloc(bytes);
... 
    return [NSData dataWithBytesNoCopy:data length:bytes];;
}

アップルのドキュメントから:

返されたオブジェクトはバイトポインタの所有権を取得し、割り当て解除時に解放します。

呼び出し元関数で戻りデータオブジェクトを解放する必要がありますか?

-(void)testFunction
{
NSAutoreleasePool *nsp = [[NSAutoreleasePool alloc] init];

NSData *ldata = [mObject dataFromBytes];
NSlog(@"%@", ldata)//printing data
[nsp release];
NSlog(@"%@", ldata)//Not printing data //sometimes getting exc_bad_access

}
4

1 に答える 1

7

簡単な答え:いいえ、呼び出し元は、返されたデータを保持している場合にのみ解放する必要があります。あなたtestFunctionはそれを保持していないので、それを解放するべきではありません。

長い答え:まず、dataFromBytes上記のコードのメソッドには戻り値がありません。おそらく、これは実際にはを返すはずNSData *です。

とにかく、メソッドは、メソッドからすぐに返さdataWithBytesNoCopy:length:れる自動解放されたインスタンスを返します。NSDataメソッド名にinit、new、またはcopyが含まれていないため、自動リリースされることがわかっています。これは、呼び出し元が返されたデータの所有権を自動的に取得しないため、データを解放しないことを意味します(データを保持しない限り)。

マロックされたの所有権はdataNSDataオブジェクトによって引き継がれるため、解放しないでください。NSDataインスタンスの割り当てが解除されると、mallocされたメモリが解放されます。

あなたの中で、testFunctionあなたはオブジェクトを受け取り、NSDataそれを印刷しています。次に、自動解放プールを解放します。これにより、自動解放されたオブジェクトが解放され、割り当てが解除されます。もう一度印刷しますが、すでに割り当てが解除されているため、危険です(必ずしもそうとは限らないことに驚いています)EXC_BAD_ACCESS

于 2012-04-21T14:41:15.773 に答える