2011-01-05 31 views
0

有人可以帮我理解分配和内存管理是如何完成和处理的。我给一个伪代码示例和问题,多数民众赞成困扰我是直列以下:与Iphone autorelease使用有关的问题

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; 
} 
+0

对这个问题投票抱歉,这是一个基本的内存管理问题,可以在Apple开发人员文档中找到答案。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html 但要回答你的问题:你必须autorelease或释放number1。 – Moszi 2011-01-05 21:38:07

+1

@Moszi如果您下载了基本文档可以回答的所有问题,您很快就会用完每日投票津贴。 :-) – 2011-01-05 21:40:32

+0

@middaparka哈哈:) - 我喜欢“第一次阅读,然后问”的方法... – Moszi 2011-01-05 21:45:35

回答

1

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

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

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

如果你不这样做,分配给number1以前的对象每次都会check被称为泄漏。

+0

不应该在第一次发布之前检查number1是否已经实例化? – 2011-01-05 21:50:59

+0

@middaparka不会。它最初会被设置为“nil”,并且调用一个“nil”值的方法什么也不做。 – grahamparks 2011-01-05 21:55:29

+0

酷 - 很高兴知道。 :-) – 2011-01-05 21:58:33

-1

正如你allocing的NSDecimalNumber,你需要释放它。 (正如你在dealloc中所做的那样)。

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

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

+0

你也不需要**太。如果他想要一个糟糕的,内存泄露的应用程序,这取决于开发人员。 :)如你所知,我已经覆盖NSObject的alloc方法在一个类别中,所以它不会保留该对象一次,但arc4random()次数。 – 2011-01-05 21:42:23

+0

'number1'是一个实例变量,所以我们可以假定它在这个方法的范围之外是需要的(在dealloc中,如果没有其他地方的话)。 – grahamparks 2011-01-05 21:42:43

+0

@grahamparks是的 - 我正在更新我的答案,提到他正在做的正确的事情释放它在dealloc。 – 2011-01-05 21:44:27