iPhone:在对象上调用释放:它会立即释放吗?

Posted

技术标签:

【中文标题】iPhone:在对象上调用释放:它会立即释放吗?【英文标题】:iPhone: calling release on an object: Does it get released right away? 【发布时间】:2011-04-28 01:47:11 【问题描述】:

我的应用中有一个购物车。我还有一个名为“Empty Cart”的 UIBarButton。我正在实现此按钮的功能。但是,我遇到了一些问题。我的购物车是一个单例数据对象。我想要做的是当用户按下“空购物车”时,购物车中的所有对象和变量值都应该被释放和/或设为 0。

我在 ViewController 中实现了一个“emptyCart”方法,它依次调用 CartSingleton 的“emptyCart”方法。我的问题如下所示,对各种对象的释放调用没有释放对象,因为当我在运行“空购物车”后打印购物车的内容时,我仍然可以看到购物车中的所有项目。发布消息不是马上生效吗?那我怎样才能立即释放我购物车中的所有物品呢?

代码- Singleton 中的“空购物车”:

-(void)emptyCart

if (self.selectedLocation != NULL)
   
    [self.selectedLocation release];
    self.locationSelected = false;
   

if (self.foodItemsArray != NULL)
   
    for (int i = 0; i < [self.foodItemsArray count]; i++)
       
        FoodItem *temp = [self.foodItemsArray objectAtIndex:i];
        if (temp.sidesArray != NULL)
           
            [temp.sidesArray release];
           
       
[self.foodItemsArray release];  
   

if (self.drinkItemsArray != NULL)
   
    [self.drinkItemsArray release];
   

if (self.otherItemsArray != NULL)
   
    [self.otherItemsArray release];
   

if (self.customerInfo != NULL)
   
    [self.customerInfo release];
   

self.numFoodItems = 0;
//self.totalTaxPercent = 0;
self.foodItemsTotalCost = 0;
self.drinkItemsTotalCost = 0;
self.otherItemTotalCost = 0;
self.totalCostOfAllItems = 0;
self.totalTaxesAmount = 0;
self.totalChargesWithTaxes = 0;
self.gratuity = 0;
self.miscCharges = 0;

【问题讨论】:

首先,您应该比较 nil 而不是 NULL。您也可以将release 发送到您的对象,因为如果您向nil 发送消息,Objective-C 不会做任何事情,它不会中断或抛出异常。因此,即使self.otherItemsArraynil,也只需调用self.otherItemsArray = nil;,它将为您执行release(因为您@synthesized 它)。 非常感谢您的回答。 所以你说的是我不需要这样做:[self.otherItemsArray release];相反,我应该这样做: self.otherItemArray = nil;我已经为 self.otherItemsArray 分配了一个对象,如下所示: self.otherItemsArray = [NSMutableArray alloc] initWithCapacity:0];既然我用了alloc,那不就是说我需要用release吗? 【参考方案1】:

立即释放释放——意思是减少保留计数,如果保留计数为 0,则对象被释放。

您的问题是您持有对象 - 完成后没有将变量设置为 nil。

我也担心你释放的次数太多

    数组在释放时释放其元素

    如果您将它们设置为 nil,保留的 @properties 将释放它们设置的对象 - 您应该像这样清除它们:

    self.customerInfo = nil;

所以,小心。看起来您现在正在访问已发布的对象——最终会崩溃。过度释放也会导致问题。

尝试找出这些问题

    使用 Build and Analyze 并修复它报告的错误

    打开 Zombies 并查看您是否正在访问已释放的对象

    http://www.loufranco.com/blog/files/debugging-memory-iphone.html

【讨论】:

是的,你是对的。运行空购物车后,当我使用“EXC BAD ACCESS”消息打印购物车时,我的应用程序崩溃。我会按照你建议的方式试一试。感谢您的建议,我会尽快发布我的结果。 看看这个loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html我试图详细解释EXC_BAD_ACCESS是什么并给出故障排除提示。【参考方案2】:

release 只是减少对象的保留计数。运行时,当它观察到保留达到零时,将调用对象的dealloc 方法。

因此,如果您仍然有对象,这意味着其他对象已在该对象上放置了保留(增加其保留计数),这意味着它们将保留。

【讨论】:

我明白了。感谢您的回答。我会检查的。

以上是关于iPhone:在对象上调用释放:它会立即释放吗?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 如果在自动释放后保留会发生啥?

可以在调用实例方法时释放 Objective-C 对象吗?

Java我可以主动去释放对象占的内存吗?可以的怎释放?

iOS:如果您长按然后释放它,UIButton 文本不会立即更改

iphone基本发布问题

我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?