iPhone:调用对象上的释放:是否立即释放?
我的应用程序中有一个购物车。我还有一个叫做“空车”的UIBarButton。我正在实现此按钮的功能。然而,我遇到了一些问题。我的购物车是一个单例数据对象。我想做的是当用户按下“Empty Cart”时,Cart中的所有对象和变量值都应该被释放和/或设置为0 我在ViewController中实现了一个“emptyCart”方法,它依次调用CartSingleton的“emptyCart”方法。我的问题如下所示:对各种对象的释放调用没有释放对象,因为在运行“空购物车”后打印购物车的内容时,我仍然可以看到购物车中的所有项目。发布消息是否不会立即生效?那么,我如何立即释放购物车中的所有物品 单件商品中的“空购物车”代码:iPhone:调用对象上的释放:是否立即释放?,iphone,release,Iphone,Release,我的应用程序中有一个购物车。我还有一个叫做“空车”的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
我还担心你释放的次数太多了
立即释放释放——这意味着它减少了保留计数,如果保留计数为0,则对象被释放 您的问题是,您正在保留对象——在处理完这些对象后,没有将变量设置为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;