0

次のコード スニペットでは:

NSMutableArray *tmpItemsArray =[[[NSMutableArray alloc] init] autorelease];

while (sqlite3_step(fetch_statement)==SQLITE_ROW){

    int pk =    sqlite3_column_int(fetch_statement,0);  

    Item_A *itemA = [[Item_A alloc] getItemA:pk fromDatabase:db];

    // calculate and set a property of itemA
    [itemA setValue:xValue forkey:xKey];

    // insert into array
    [tmpItemsArray addObject:itemA];
    [itemA release];
}
sqlite3_reset(fetch_statement);

// for each ItemA in array      
    // update itemA in database
for (Item_A *eachItemA in tmpItemsArray) {
    [eachItemA updateItemAInDatabase:db];
}

addObject: メソッドを使用して tmpItemsArray にオブジェクトを追加すると、itemA が指すメモリ アドレスにあるオブジェクトが配列に追加されます。つまり、tmpItemsArray 内のオブジェクトは、ItemA が指すのと同じメモリ アドレスを指しています。

ここで[itemA release]を実行すると、メモリを解放する -

tmpItemsArray には無効なメモリを指すオブジェクトがありますか

また

[itemA release] は、itemA がこのメモリに対して保持している (ある意味で) のみを解放しますか?

4

2 に答える 2

0

いいえ、[itemA release]が呼び出されると、カウンタがデクリメントされ、カウンタがゼロに達したときにのみメモリが解放されます。誰かがオブジェクトの所有権を主張するたびに(たとえば、配列に入力されたとき)、カウンターは増加します。

于 2012-07-04T17:14:40.000 に答える
0

release実際にはメモリが解放されることはありません。代わりに、コードの一部がオブジェクトを保持した回数を表すカウントをデクリメントします。オブジェクトを割り当てるという行為は、1つの保持と同等であり、それを配列に追加することは別のことです。バランスreleaseを取り、allocその時点で、アレイの保持により、アレイの割り当てが解除されないようにします。

配列がなくなると、他のイベントがなければ、その内容が解放されます。これは自動解放された配列であるため、プログラムのイベントループの次の反復で発生する可能性があります。

于 2012-07-04T17:15:23.417 に答える