2011-02-27 87 views
0

我有Util类,如下所示。Objective-C对象的分配/释放

@implementation Util 

- (NSString*) getTodayString 
{ 

    NSDate *today = [NSDate date]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     // display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings 
    [dateFormatter setDateFormat:@"YYYY/MM/dd"]; 
    NSString *now = [dateFormatter stringFromDate:today]; 

    [dateFormatter release]; ///??? 
    [today release]; //??? 
    return now; 
} 

@end 

而且我用

- (void)awakeFromNib 
{ 
    Util *ut = [[Util alloc] init]; 
    NSString* now = [ut getTodayString]; 
    NSLog(@"User's current time in their preference format:%@",now); 

    [currentTime setObjectValue:now]; 
    [now release]; ///??? 
    [ut release]; 
} 

我释放对象时感到困惑的类。

在getTodayString ::

Q1。 [dataFormatter版本]是必要的? Q2。 [今天发布]是必要的?

我想我不需要释放他们,因为我没有拨出自己。如果这是真的,那么这些物体何时被释放?

In awakeFromNib ::

Q3。 [ut释放]是必要的? Q4。 [现在发布]是必要的?

我想我必须发布ut作为我明确创建对象,但不是关于now对象的suer。

  • 如何确定对象何时被释放?
  • 用python/C#/ Java不再关心这种类型的内存释放。如果我不关心它们,Objective-C也可以吗?

回答

4

Q1。 [dataFormatter发布]是否需要 ? Q2。 [今日发布]是否需要 ?

dataFormatter:是的,你分配/ init'd它。
今天:不,它从工厂方法返回autoreleased。

Q3。 [ut释放]是必要的? Q4。 [现在发布]是必要的吗?

同样,

UT:是的,你分配/ init'd它。
now:不,它从工厂方法返回自动释放。

如何确定 对象何时被释放?

它时release被称为上公布,如果autorelease被调用,release将自动释放池在下次运行时被调用。

Objective-C还可以,如果我 不关心它们吗?

不,它不好。如果你自己没有清理完毕,你将会发生严重的内存泄漏,在iOS环境中意味着应用程序完全关闭。在一个Mac应用程序,可以导致吃了一吨的记忆,而不是一个好公民。这是假设一个非垃圾收集环境。即最。

我猜你的问题的核心是你不确定何时负责调用release以及何时得到autoreleased对象(或者说,当你负责调用对象的释放时)。这是惯例。如果你调用任何方法返回的对象不包含包含的话:init/copy然后它是不是你的责任来调用发布。如果你保留,你会发布(可能有更多的规则可以遵循,但这是第一个真正开始理解这一点的人,在我看来)。如果你曾经调用alloc/init/copy,那么你必须在某个时候调用release

伟大的老师是Build &分析在Xcode。这会很快指出你搞砸的地方,并且真正帮助你理解正在发生的事情。

+0

避免对从类方法自动发布的对象进行假设。总是考虑对象所有权,即“我是否拥有这个对象?我是否从名称中带有'new','copy'或'alloc'的方法得到它?” – dreamlax 2011-02-27 23:56:53

+0

好点,澄清了我在这方面的发言。 – MarkPowell 2011-02-28 00:21:00

1

您是否关心objective-c中的内存管理取决于您所使用的环境。如果您正在使用垃圾回收,您不必担心它,但默认情况下,垃圾回收未在Mac上启用,并且在iOS上根本不可用。因为当有什么需要的基本规则被释放:

  • 如果从开始得到它与ALLOC或init,或包含单词副本的方法,那么你拥有它,必须将其释放。
  • 如果您明确保留一个对象,则您拥有它并且必须释放它。
  • 如果该方法不包含alloc,init或copy,则可以假定它已被自动释放。它将在未来的某个时刻自动发布,如果您想在当前方法返回后使用它,则需要保留它。

当然,这些也取决于任何第三方代码遵循这些规则,当他们autorelease返回的对象。

+1

'init'不影响对象的保留计数,只有'alloc'。否则,你需要释放它两次。 – dreamlax 2011-02-27 23:57:34

+0

@dreamlax不,但它表明您拥有该物体。 – ughoavgfhw 2011-02-28 05:31:44

1

memory management rules简单明了。不要认为就保留数量而言,总是考虑所有权。当你问自己问题“应该释放这个对象吗? ”,问问自己“我是否拥有它? ”。将规则提交给记忆,最终他们将成为第二天性。

遵守规则是非常重要的。如果你忽略它们,那么你不拥有的对象可能会在你完成它们之前解除分配(比如分配不属于实例变量的对象,它们可能会在自动释放池被耗尽后解除分配)。另外,如果你忽略它们,你将最终导致可怕的内存泄漏。