分配/释放Objective-C对象

时间:2011-02-27 23:16:30

标签: objective-c memory-management memory-leaks

我有Util课程如下。

@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。 [今日发布]有必要吗?

我想我不需要释放它们,因为我没有分配自己。如果这是真的,那么这些对象何时被释放?

在awakeFromNib ::

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

我想我必须在显式创建对象时释放ut,但不要对now对象提起诉讼。

  • 如何判断对象何时被释放?
  • 使用python / C#/ Java,人们不再关心这种内存的重新分配。如果我不关心它们,Objective-C也可以吗?

3 个答案:

答案 0 :(得分:4)

  

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

dataFormatter :是的,你分配/初始化它。
今天:不,它是从工厂方法返回的。

  

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

同样,

ut :是的,你分配/初始化它。
现在:不,它是从工厂方法返回的。

  

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

在调用release时发布,如果调用autorelease,则会在下次运行自动释放池时调用release

  

如果我,也可以使用Objective-C   不关心他们?

不,不行。如果你没有自己清理,你将有大量的内存泄漏,在iOS环境中,这意味着你的应用程序完全关闭。在一个Mac应用程序,可能会导致大量的记忆,而不是一个好公民。这假设是非垃圾收集环境。即大多数。

我猜你的问题的核心是你不确定你何时负责调用release以及当你得到一个autoreleased对象时(或者更确切地说,当你负责呼叫时)释放对象)。按照惯例。如果您调用任何返回包含单词的对象的方法:init / copy,则您无权调用release。如果你保留,你发布(可能还有一些规则要遵循,但在我看来,这是第一个真正开始理解这个规则的规则)。如果你曾经调用过alloc / init / copy,那么你必须在某个时候调用release

一位伟大的老师是Build&在Xcode中分析。这将很快指出你搞砸了什么,并真正帮助理解发生了什么。

答案 1 :(得分:1)

您是否关心objective-c中的内存管理取决于您使用的环境。如果您正在使用垃圾收集,则不必担心它,但默认情况下不会在mac上启用垃圾收集,并且在iOS上根本不可用。什么时候需要发布的基本规则:

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

当然,这些规则还依赖于遵循这些规则的任何第三方代码,以及它们自动释放返回的对象。

答案 2 :(得分:1)

memory management rules简单明了。不考虑保留计数,总是考虑所有权。当你问自己“我应该释放这个对象吗?”这个问题时,问问自己“我拥有它吗?”。将规则归于记忆,最终它们将成为第二天性。

遵守规则极为重要。如果忽略它们,那么您不拥有的对象可能会在完成之前被释放(例如,将您不拥有的对象分配给实例变量,它们可能会在自动释放池耗尽后被释放)。此外,如果你忽略它们,你最终会发生可怕的内存泄漏。