iPhone:调用对象上的释放:是否立即释放?

iPhone:调用对象上的释放:是否立即释放?,iphone,release,Iphone,Release,我的应用程序中有一个购物车。我还有一个叫做“空车”的UIBarButton。我正在实现此按钮的功能。然而,我遇到了一些问题。我的购物车是一个单例数据对象。我想做的是当用户按下“Empty Cart”时,Cart中的所有对象和变量值都应该被释放和/或设置为0 我在ViewController中实现了一个“emptyCart”方法,它依次调用CartSingleton的“emptyCart”方法。我的问题如下所示:对各种对象的释放调用没有释放对象,因为在运行“空购物车”后打印购物车的内容时,我仍然可

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

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

单件商品中的“空购物车”代码:

-(void)emptyCart
{

if(self.selectedLocation!=NULL)
{
[自行选择位置发布];
self.locationSelected=false;
}
if(self.foodItemArray!=NULL)
{
for(int i=0;i<[self.foodItemArray count];i++)
{
FoodItem*temp=[self.foodItemArray对象索引:i];
如果(临时sidesArray!=NULL)
{
[温度侧射线释放];
}
}
[self.foodItemsArray发布];
}
if(self.drinkItemsArray!=NULL)
{
[self.drinkItemsArray发布];
}
if(self.otherItemsArray!=NULL)
{
[self.otherItemsArray发布];
}
if(self.customerInfo!=NULL)
{
[自定制信息发布];
}
self.numFoodItems=0;
//self.totalTaxPercent=0;
self.foodItemsTotalCost=0;
self.drinkItemsTotalCost=0;
self.otherItemTotalCost=0;
self.totalCostOfAllItems=0;
self.totalTaxesAmount=0;
self.totalChargesWithTaxes=0;
自付小费=0;
self.mischarges=0;

立即释放——这意味着它减少了保留计数,如果保留计数为0,则对象被释放

您的问题是,您正在保留对象——在处理完这些对象后,没有将变量设置为nil

我还担心你释放的次数太多了

  • 数组在元素被释放时释放它们
  • 如果将retained@properties设置为nil,则它们将释放设置为的对象-您应该像这样清除它们:

    self.customerInfo=nil

  • 所以,请注意。看起来您现在正在访问已发布的对象——最终会崩溃。过度发布也会导致问题

    试图找出这些问题

  • 使用构建、分析和修复它报告的错误
  • 启用“僵尸”,查看是否正在访问已发布的对象


  • 立即释放释放——这意味着它减少了保留计数,如果保留计数为0,则对象被释放

    您的问题是,您正在保留对象——在处理完这些对象后,没有将变量设置为nil

    我还担心你释放的次数太多了

  • 数组在元素被释放时释放它们
  • 如果将retained@properties设置为nil,则它们将释放设置为的对象-您应该像这样清除它们:

    self.customerInfo=nil

  • 所以,请注意。看起来您现在正在访问已发布的对象——最终会崩溃。过度发布也会导致问题

    试图找出这些问题

  • 使用构建、分析和修复它报告的错误
  • 启用“僵尸”,查看是否正在访问已发布的对象


  • release
    只会减少对象的retain计数。运行时在观察到retain达到零时,将调用对象的
    dealloc
    方法


    因此,如果仍有对象在其中,这意味着其他对象已将retain放置在该对象上(增加其retain计数)这意味着它们将继续存在。

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


    因此,如果仍有对象在其中,这意味着其他对象已将retain放置在该对象上(增加其retain计数)这意味着它们将继续存在。

    首先,你应该与
    nil
    进行比较,而不是
    NULL
    。你也可以向你的对象发送
    release
    ,因为如果你向
    nil
    发送消息,Objective-C不会做任何事情,它不会中断或引发异常。因此,即使
    self.otherItemsArray
    nil
    ,只需调用
    self.otherItemsArray=nil;
    它将为您执行
    发布
    (因为您将其合成)。非常感谢您的回答。因此您的意思是我不需要这样做:[self.otherItemsArray release];相反,我应该这样做:self.otherItemsArray=nil;我为self.otherItemsArray分配了一个对象,如下所示:self.otherItemsArray=[NSMutableArray alloc]initWithCapacity:0];因为我使用了alloc,这不意味着我需要使用release吗?首先,你应该比较
    nil
    ,而不是
    NULL
    。你也可以将
    release
    发送到你的对象,因为Objective-C不会做任何事情,如果你将消息发送到
    nil
    ,它不会中断或引发异常。因此,即使self.otherItemsArray是
    nil
    ,只要调用
    self.otherItemsArray=nil;
    它就可以为您发布
    了(因为您合成了它)。非常感谢您的回答。所以您的意思是我不需要这样做:[self.otherItemsArray release];相反,我应该这样做:self.otherItemArray=nil;我已经为self.otherItemsArray分配了一个对象
    
    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;