1

iPhone SDK でのメモリ管理の 1 つの側面を理解しようとしています。

私が走った場合:

for (int x = 0; x < 10; x++)  {
    NSMutableArray *myArray = [[NSMutableArray alloc] init];
}

メモリ内に 10 個の myArray オブジェクトを作成していますか、それとも割り当てごとに前のものを上書きしますか? 後者の場合、クリーンアップのためにループの後に 1 つの [myArray release] だけが必要になると思います。前者の場合、For ループ内でリリースが必要だと思います。

ありがとう。

4

6 に答える 6

2

10の異なる割り当てを取得し、メモリリークが必要ない場合は、それらを解放する必要があります。

 for (int x = 0; x < 10; x++)  {

    NSMutableArray *myArray = [[NSMutableArray alloc] init];
    ....
    [myArray release];
 }

リリースしない場合、リークされたオブジェクトは実際にはコメントのように9ではなく10になります。これは、ループの外側ではループローカル変数にアクセスできず、最後に割り当てられたオブジェクトにも到達できないためです。

于 2011-08-04T19:31:55.950 に答える
2

実際には、10個のリークがある10個のオブジェクトがあります。ループを離れるとmyArray、スコープ内になくなるため(したがってアクセスできなくなります)、10番目の割り当てを解放する方法もありません。

于 2011-08-04T19:33:30.080 に答える
1

その場合、保持カウントが1で、参照がまったくない10個の異なる配列オブジェクトを作成します。これは「メモリリークファクトリ」であり、10個のオブジェクトがメモリから解放されることはありません。:)

oooops...リリースが表示されませんでした...9個のリークされたアレイ。

于 2011-08-04T19:33:06.447 に答える
1

10 個のオブジェクトを作成していますが、そのうち 9 個がリークされています。ループの最後でそれらを使用した後、解放する必要があります。

これもiPhone SDKだけではありません。これは基本的な Cocoa メモリ管理です。Macでも動作します。

于 2011-08-04T19:30:45.107 に答える
0
for (int x = 0; x < 10; x++)  {

    NSMutableArray *myArray = [NSMutableArray array]; //Its an autorelease
    ....
}

これにより、10 個の異なるNSMutableArrayオブジェクトが作成されます。実際には明示的に解放する必要はありません。myArray実行ループの最後に自動解放されます。

名前が「alloc」または「new」で始まるメソッド、または「copy」を含むメソッド (たとえば、、、または ) を使用してオブジェクトを作成した場合、または保持メッセージを送信した場合、オブジェクトの所有権を取得allocnewObjectますmutableCopyreleaseまたはを使用して所有しているオブジェクトの所有権を放棄する責任がありますautorelease。それ以外のオブジェクトを受け取った場合は、それを解放してはなりません。

ではNSMutableArray *myArray = [NSMutableArray array];、配列の所有権を取得せず、自動的に解放されて渡されます。

メモリ管理の詳細については、こちらをご覧ください。

于 2011-08-04T19:36:07.920 に答える
0

誰もが (正しく) 言ったことに加えて、Cocoa は autoreleased オブジェクトもサポートしています。スニペットを次のように言い換えると:

for (int x = 0; x < 10; x++)
{      
    NSMutableArray *myArray = [NSMutableArray arrayWithObjects: ...];     
    //....     
} 

それでも 10 個の異なる配列を割り当てますが、リークするものはありません。それらは最終的に自動リリースされます。

于 2011-08-04T19:54:10.813 に答える