Iphone 这两个init方法之间的区别是什么?

Iphone 这两个init方法之间的区别是什么?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,据我所知,第一个你完成后必须发布,第二个你不发布。为什么要在第二次初始化中使用第一次初始化 NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"title", @"text", nil]; 及 第一个init方法是一个实例方法(用于[NSMutableDictionary alloc]返回的实例),它不是一个自动释放的对象,保留计数为1 第二个是类方法,返回一个自动释放的

据我所知,第一个你完成后必须发布,第二个你不发布。为什么要在第二次初始化中使用第一次初始化

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


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


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

您是正确的;对于第一个版本,您需要显式释放对象。如果要将第一个版本分配给类中的实例变量,那么它很有用;i、 e.它是一个将在当前UI事件之后存在的字典(后一个对象是自动删除的,以后在您的程序中不可用)

例如:

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

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

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

请阅读。9个短段落,你可以在一分钟内阅读。它们清楚地解释了两者之间的区别

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

在电源不足且内存不足的iPhone上,除非您将被迫使用autorelease(例如,如果您要从名称不以“alloc”或“new”开头或包含“copy”的方法返回它),否则您通常会选择前者。如果要自动释放,请使用第二种形式。否则,使用第一个表单并在方法中显式地释放它

在Mac电脑上,它有足够的电源和内存使自动释放池成为一个微不足道的细节(在所有情况下,除了最符合路径的情况),您可以在任何情况下使用第二种形式。通常,如果要保留它,您会将其指定给“复制/保留”属性,这样就不需要保留它。在init方法中存在例外,您不能使用setter,或者在手动实现的setter中,因此需要自己分配给ivar。在这些情况下,您通常会使用前者


但所有这些都只是风格/过早的优化(在这种情况下不一定是坏的,因为in是一种低噪音的优化,评测不会检测到,通常只会让你的应用程序慢一点)。重要的是阅读规则并遵循它们所说的,如果你这样做,你可以随意使用任何一种形式。

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

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

你为什么要用第一个 第二次初始化

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"title", @"text", nil];
通常认为的方法(Apple文档支持)是,在大多数情况下,使用自动释放对象是绝对正确的。我不同意Peter Lewis关于iPhone“动力不足”到需要避免自动释放对象的说法。在大多数应用程序中,手机提供自动释放对象的额外开销微乎其微。因此,您可以在代码中随意使用自动释放对象,如果需要保留它们,只需显式地保留它们即可

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

综上所述,;大部分时间使用2),但如果要同时创建和挖沟很多对象,请使用1


希望这有助于

+1提及那些特殊的、环紧的动物。我想补充一点,如果在一个紧密循环中使用大量库调用,并且使用自动释放对象本身,那么可以为循环的每个迭代创建并销毁一个NSAutoreleasePool。这一点也不贵,而且可以阻止潜在的严重内存膨胀。是的,这是卡通的一个亮点。我确实想过要提到这一点,但我觉得我的帖子足够长了!