我的应用中有购物车。我还有一个叫做“空车”的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;
答案 0 :(得分:3)
立即释放版本 - 这意味着它会减少保留计数,如果保留计数为0,则会释放该对象。
你的问题是你抓住了对象 - 完成后不要将变量设置为nil。
我也担心你会释放太多次
保留@properties会释放它们设置的对象,如果你将它们设置为nil - 你应该像这样清除它们:
self.customerInfo = nil;
所以,小心。现在看起来你正在访问已发布的对象 - 最终会崩溃。过度释放也会造成问题。
试图找出这些问题
启用Zombies并查看您是否正在访问已发布的对象
http://www.loufranco.com/blog/files/debugging-memory-iphone.html
答案 1 :(得分:0)
release
只会减少对象的保留计数。运行时,当它观察到retain保持为零时,将调用对象的dealloc
方法。
因此,如果你仍然有对象,这意味着其他对象已经在对象上放置了保留(增加其保留计数),这意味着它们会一直存在。