【问题标题】:what does -arrayWithArray actually DO?-arrayWithArray 实际上是做什么的?
【发布时间】:2010-11-26 09:19:29
【问题描述】:

我想看看它是如何创建一个数组的。如何查看显示其完成方式的 .m 文件?

【问题讨论】:

    标签: iphone objective-c uikit nsmutablearray nsarray


    【解决方案1】:

    正如@Ken 提到的,您看不到源代码(尽管您可以通过 gdb 反汇编该方法)。

    该方法本身会创建给定数组的不可变(无法更改)、自动发布副本。以下行为相同:

    // Both resulting arrays are immutable and won't be retained
    NSArray* immutableArray = [[[NSArray alloc] initWithArray:mutableArray] autorelease];
    NSArray* immutableArray = [NSArray arrayWithArray:mutableArray];
    NSArray* immutableArray = [[mutableArray copy] autorelease];
    

    我猜,请根据简洁性来选择你喜欢的那个:-)。

    【讨论】:

    • 嗯...它是不可变的?好吧,我需要向新数组中的每个对象发送一条额外的释放消息(使用 alloc init),这样就不会有泄漏。如何释放不可变数组中的所有对象?
    • 对象在添加的时候是被数组保留的,所以当数组被释放的时候,里面的对象也应该被释放
    • 为什么需要一个新数组来向对象发送释放消息?不可变意味着 ARRAY 无法更改,您始终可以更改(或发送消息)数组内的对象......或者更好的是,在将对象添加到数组之前自动释放对象,然后您不必担心任何事情。
    【解决方案2】:

    不,Cocoa 不是开源的。

    如果你有问题,你应该问它。

    这将是一种有效的实现方式:

    + (id)arrayWithArray:(NSArray *)array {
        return [[[self alloc] initWithArray:array] autorelease];
    }
    

    您可以阅读NSArray 的 GNUStep 源代码,但请注意,这是 Cocoa API 的替代实现。

    【讨论】:

      【解决方案3】:

      如果你问+arrayWithArray 的目的是什么(除了作为-initWithArray 的自动释放包装器),我会说是这样:当你想创建一个数组的自动释放副本时使用它。换句话说,你可以这样看:

      NSArray * original = /* ... */;
      NSArray * newArray = [NSArray arrayWithArray:original];
      

      相当于:

      NSArray * original = /* ... */;
      NSArray * newArray = [[original copy] autorelease];
      

      我会说它适合您的风格时使用方便。

      【讨论】:

      • 这并不完全正确。您的假设是 original 是一个 NSArray。但它可以是从 NSArray 派生的任何东西。并且对象的类可以实现自己的copy。因此[[original copy] autorelease]; 不能保证返回一个 NSArray。
      【解决方案4】:

      GNUstep 是 OPENSTEP 规范的 GNU 实现,Cocoa 和 Cocoa Touch 均源自该规范,实现 +arrayWithArray: 如下:

      /**
       * Returns a new autoreleased NSArray instance containing all the objects from
       * array, in the same order as the original.
       */
      + (id) arrayWithArray: (NSArray*)array
      {
        id    o;
      
        o = [self allocWithZone: NSDefaultMallocZone()];
        o = [o initWithArray: array];
        return AUTORELEASE(o);
      }
      

      http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSArray.m?view=markup

      【讨论】:

        猜你喜欢
        • 2011-03-11
        • 2015-06-23
        • 2017-12-26
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多