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.otherItemsArray
是nil
,也只需调用self.otherItemsArray = nil;
,它将为您执行release
(因为您@synthesize
d 它)。
非常感谢您的回答。
所以你说的是我不需要这样做:[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:在对象上调用释放:它会立即释放吗?的主要内容,如果未能解决你的问题,请参考以下文章