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



在下面的代码片段中:

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 释放] 时,要释放内存 -

tmpItemsArray 是否有指向无效内存的对象

[itemA 释放] 是否仅释放 itemA 在此内存上的保留(以某种方式)?

release实际上并不会导致内存被释放。 相反,它递减一个计数,该计数表示代码的某些部分保留对象的次数。 分配对象的行为等效于一个保留,将其添加到数组是另一个。 您的release平衡了alloc,此时,阵列的保留将阻止它被解除分配。

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

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

最新更新