9

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

4

4 回答 4

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];

我想根据简洁选择你喜欢的那个:-)。

于 2009-09-08T04:57:51.543 回答
2

不,Cocoa 不是开源的。

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

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

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

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

于 2009-09-08T04:32:32.013 回答
2

如果您要问的目的是什么+arrayWithArray(除了作为-initWithArray. 换句话说,你可以这样看:

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

相当于:

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

我想说当它适合你的风格时,它是为了方便使用。

于 2009-09-08T04:45:48.180 回答
0

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

于 2009-09-08T13:19:43.747 回答