-arrayWithArray实际上做了什么?

时间:2009-09-08 04:06:55

标签: iphone objective-c uikit nsmutablearray nsarray

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

4 个答案:

答案 0 :(得分:16)

正如@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];

根据简洁选择你喜欢的任何一个,我想: - )。

答案 1 :(得分:2)

不,Cocoa不是开源的。

如果您有疑问,您应该问问题。

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

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

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

答案 2 :(得分:2)

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

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

相当于:

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

我认为它符合您的风格,方便使用。

答案 3 :(得分:0)

GNUstep,Cocoa和Cocoa Touch下降的OPENSTEP规范的GNU实现,实现+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