iPhone:在对象上调用release:它是否会立即释放?

时间:2011-04-28 01:47:11

标签: iphone release

我的应用中有购物车。我还有一个叫做“空车”的UIBarButton。我实现了这个按钮的功能。但是,我遇到了一些问题。我的购物车是Singleton数据对象。我想要做的是当用户按下“空车”时,购物车中的所有对象和变量值都应该被释放和/或为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;

2 个答案:

答案 0 :(得分:3)

立即释放版本 - 这意味着它会减少保留计数,如果保留计数为0,则会释放该对象。

你的问题是你抓住了对象 - 完成后不要将变量设置为nil。

我也担心你会释放太多次

  1. 阵列在发布时释放元素
  2. 保留@properties会释放它们设置的对象,如果你将它们设置为nil - 你应该像这样清除它们:

    self.customerInfo = nil;

  3. 所以,小心。现在看起来你正在访问已发布的对象 - 最终会崩溃。过度释放也会造成问题。

    试图找出这些问题

    1. 使用构建和分析并修复其报告的错误
    2. 启用Zombies并查看您是否正在访问已发布的对象

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

答案 1 :(得分:0)

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

因此,如果你仍然有对象,这意味着其他对象已经在对象上放置了保留(增加其保留计数),这意味着它们会一直存在。