这两种init方法有什么区别?

时间:2009-08-16 18:48:58

标签: iphone objective-c cocoa-touch

据我所知,你完成时必须释放的第一个,而你没有的第二个。你为什么要在第二次使用第一次初始化?

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"title", @"text", nil];

NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"title", @"text", nil];

5 个答案:

答案 0 :(得分:2)

你是对的;对于第一个版本,您需要显式释放该对象。如果您将它分配给类中的实例变量,则第一个版本很有用;即它是一个超出当前UI事件的字典(后一个对象是自动释放的,以后在你的程序中不可用)。

例如:

-(id)init
{
    if (self = [super init])
    {
        myDict = [[NSDictionary alloc] init ...];
    }
    return self;
}

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

答案 1 :(得分:2)

正如其他人所说的那样,从某种意义上讲,你的两个例子之间没有区别,只是第一个回复了一个保留的对象,在你明确释放它之前不会被释放,第二个是自动释放的对象这将在下一个运行循环开始时自动释放,除非你在此之前明确地保留它。

然而,问题的关键部分是:

  

为什么要使用第一个   初始化超过第二个?

通常认为的方法(Apple文档的支持)是在大多数情况下使用自动释放的对象绝对精细。我不同意彼得·刘易斯在这里关于iPhone如此“动力不足”,你需要避免自动释放的物体。在大多数应用程序中提供自动释放对象的手机上的额外开销是微不足道的。因此,您可以随意在代码中使用自动释放的对象,并在需要依赖它们时明确保留它们。

但是,确实会产生影响紧密循环。如果您正在运行一个执行1000次的while循环,并且您正在该循环中创建之后不需要的对象,那么您应该显式创建新的非自动释放对象并显式释放它们。这是因为自动释放池在紧密循环中不会(默认情况下)为空。创建大量自动释放的对象很可能会开始遇到设备内存的限制。

总结如此;使用2)大部分时间,但使用1)如果你要一次创建和抛弃很多对象。

希望有所帮助

答案 2 :(得分:0)

第一个init方法是instance方法(适用于[NSMutableDictionary alloc]返回的实例),并且不是自动释放的对象,保留计数为1.

第二种是class方法,并返回一个自动释放的对象(基本上没有保留计数)。

答案 3 :(得分:0)

第二个是由NSMutableDictionary类自动发布的,作为第一个处理自己内存管理的类。

答案 4 :(得分:0)

阅读memory management rules。 9段,您可以在大约一分钟内阅读。他们清楚地解释了两者之间的区别。

至于为什么要使用其中一种,这取决于平台。

在处于供电和内存不足的iPhone上,你通常会更喜欢前者,除非你将被迫使用自动释放(例如,如果你要从一个名字不是的方法返回它)以“alloc”或“new”开头或包含“copy”)。如果您要自动发布它,请使用第二种形式。否则,请使用第一个表单并在方法中自行释放。

在Mac上,它具有足够的功率和内存来使自动释放池成为一个微不足道的细节(除了最常见的情况),你可以使用第二种形式。通常,如果要保留它,则将其分配给复制/保留属性,这样您就不需要保留它。例外情况是在init方法中,您不能使用setter,或者在手动实现的setter中,因此需要自己分配给ivar。在这些情况下,你经常使用前者。

但所有这些只是样式/过早优化(在这种情况下不一定是坏的,因为in是一种低级别的噪声类型的优化,分析将无法检测到,这通常会使app减慢一点)。重要的是要阅读规则并遵循他们所说的内容,如果你这样做,你可以随意使用任何一种形式。