【问题标题】:Suggest the best way of initialization of array ( or other objects )建议初始化数组(或其他对象)的最佳方式
【发布时间】:2010-12-16 22:51:06
【问题描述】:

我对以下两种初始化方式有点困惑.....

方式一:

- (void) myMethod{

    NSArray *myArray = [[NSArray alloc] initWithObjects:obj1,obj1,nil];
    [self setClassArray:myArray];
    [myArray release];
}

方式二:

- (void) myMethod{

NSArray *myArray = [NSArray arrayWithObjects:obj1,obj2,nil];
[self setClassArray:myArray];
}

在方式 1 中,我使用了一个 alloc init 方法,它是一个实例方法,并且因为我使用了一个 alloc 语句,所以我必须自己释放数组。

在方式 2 中,我使用了静态方法来初始化数组,并且由于没有使用 alloc 语句,我不需要释放内存,系统会处理。

方式一,费时费力,如果不注意可能会导致内存泄漏

方式2,写起来更快,不需要处理内存泄漏

但是,我仍然看到在标准源代码中使用的方式 1 比方式 2 更频繁。我不知道为什么人们会这样做,或者我是否在某些地方错了。

公开邀请答案和cmets。请建议最佳编程实践。

【问题讨论】:

    标签: iphone objective-c memory-management initialization


    【解决方案1】:

    您的第二个示例使用了一个方便的构造函数,它返回一个自动释放的对象。那么,问题是使用autorelease 还是alloc/release 是否更好。 mmalc 的answer on this StackOverflow thread 解释了自动释放对象的缺点。 (基本上,尽可能使用alloc/release。)

    另外(这可能是显而易见的),一些类可能没有方便的构造函数,所以在使用这些时你必须使用alloc/release。

    【讨论】:

      【解决方案2】:

      据我所知,

      [NSArray arrayWithObjects:obj1,obj2,nil];
      

      返回一个自动释放的对象,smth like

      [[[NSArray alloc] initWithObjects:obj1,obj1,nil] autorelease];
      

      而且我不喜欢使用自动释放池来管理内存。也许这只是一种偏见))

      【讨论】:

        【解决方案3】:

        当使用方法 2(自动释放)时,对象在操作系统感觉它没有引用时被释放。 但是在使用手动发布时,您可以在输入代码时直接发布,也可以随时发布。

        【讨论】:

          【解决方案4】:

          我通常更喜欢第二种方式,如果我没记错的话,这也是 Apple 文档推荐的方式(尽可能使用自动释放)。

          在方式 1 中,内存释放得更快,因此,如果您有一个在循环或递归中调用的方法,使用 autorelease 可能会积累大量内存,而 alloc/retain 将保持较低的内存占用。

          另一方面,我假设使用自动释放更有效,因为自动释放池可以一次释放一大块内存,而不是一次又一次地释放小块。强硬我可能在这里错了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-07-16
            • 2014-02-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-07
            • 2012-01-28
            相关资源
            最近更新 更多