【问题标题】:question related to Iphone autorelease usage与 iPhone 自动释放使用相关的问题
【发布时间】:2011-06-04 07:28:41
【问题描述】:

有人可以帮助我了解在以下场景中分配和内存管理是如何完成和处理的。我正在给出一个 Psuedo 代码示例,困扰我的问题如下:

interface first  
{ NSDecimalNumber *number1;  
}

implementation  
.....

-(void) dealloc {  
 [number1 release];  
 [super dealloc];  
}


=================================  
interface second  
{ NSDecimalNumber *number2;  
}  

implementation second  
.....  
- (First*) check  
{  
    First *firstObject = [[[First alloc] init] autorelease];  
    firstObject.number1 = [[NSDecimalNumber alloc] initWithInteger:0];   
                    **// do i need to autorelease number1 as well?**  
    return firstObject;  
}  

【问题讨论】:

  • 抱歉,您否决了这个问题,这是一个基本的内存管理问题,可以在 Apple 开发人员文档中找到答案。 developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 但要回答您的问题:您必须自动发布或发布编号1。
  • @Moszi 如果您下载所有可以通过基本文档回答的问题,您的每日投票津贴很快就会用完。 :-)
  • @middaparka hahh :) - 我喜欢“先读后问”的方法......

标签: iphone memory-management autorelease


【解决方案1】:

您的代码是正确的。如果您自动释放该对象,它的引用计数将达到零并被释放,然后如果您稍后尝试使用存储在 number1 中的值,您的应用程序将崩溃。

我要添加的唯一增强是释放任何现有值。即

[number1 release];
number1 = [[NSDecimalNumber alloc] initWithInteger:0];   

如果不这样做,之前分配给number1 的对象将在每次调用check 时泄漏。

【讨论】:

  • 您不应该检查 number1 在初始版本之前是否已实例化吗?
  • @middaparka 不。它最初会设置为nil,并且在nil 值上调用方法什么都不做。
  • 感谢您的改进建议。这有帮助
  • 我刚刚澄清了我有疑问的 number1 的分配。如果每次调用 check 时我都在做 alloc/init 并且 number1 是 firstobject 的实例变量,你是否仍然建议需要先释放它?
【解决方案2】:

当您分配 NSDecimalNumber 时,您需要释放它。 (正如您在 dealloc 中所做的那样。)

虽然很难根据您的示例代码提供一个有意义的示例(因为实际上并未使用“number1”),但一般规则是您对 alloccopy 或 @ 的任何对象负责987654324@。如果对象只需要在函数的范围内,你当然可以自动释放它。

http://interfacelab.com/objective-c-memory-management-for-lazy-people/ 上有一篇不错的博客文章,我建议您阅读它,因为它提供了很好的示例(包括一些边缘案例)并且易于理解。

【讨论】:

  • 您也不需要。如果他想要一个糟糕的、内存泄漏的应用程序,这取决于开发人员。 :) 如您所知,我已经在一个类别中覆盖了 NSObject 的 alloc 方法,因此它不会保留对象一次,而是保留 arc4random() 次数。
  • number1 是一个实例变量,因此我们可以假设在此方法范围之外需要它(如果没有其他地方,则在 dealloc 中)。
  • @grahamparks 是的 - 我正在更新我的答案,提到他正在做正确的事情,在 dealloc 中发布它。
  • 感谢您的链接。它也帮助澄清了我的其他一些疑问
猜你喜欢
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2011-05-03
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多