内存查询:将对象添加到数组后释放对象

时间:2012-07-04 17:06:17

标签: iphone objective-c

在以下代码段中:

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在此内存中的保持(某种方式)吗?

2 个答案:

答案 0 :(得分:0)

不,当调用[itemA release]时,计数器会递减,只有当计数器达到零时才释放内存。每当有人声明对象的所有权时(例如,当输入到数组中时),计数器就会递增。

答案 1 :(得分:0)

release实际上不会释放内存。相反,它会减少一个计数,该计数表示代码的某些部分保留了对象的次数。分配对象的行为相当于一个保留,并将其添加到数组是另一个。您的release余额为alloc,此时,数组的保留会使其无法取消分配。

当数组消失时,禁止其他事件,它将释放其内容。由于它是一个自动释放的数组,这很可能发生在程序事件循环的下一次迭代中。