我想确切地了解它是如何创建一个数组的。我该如何查看展示其创建过程的 .m 文件?
我想确切地了解它是如何创建一个数组的。我该如何查看展示其创建过程的 .m 文件?
正如@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];
根据简洁程度选择您喜欢的任何一种,我想 :-).
+ (id)arrayWithArray:(NSArray *)array {
return [[[self alloc] initWithArray:array] autorelease];
}
你可以阅读GNUStep源代码中NSArray的内容,但请注意这是Cocoa API的替代实现。
+arrayWithArray
的作用(除了封装-initWithArray
并使其自动释放),我会说它是这样的:当你想要创建一个自动释放的数组副本时,可以使用它。换句话说,你可以这样理解它:NSArray * original = /* ... */;
NSArray * newArray = [NSArray arrayWithArray:original];
相当于:
NSArray * original = /* ... */;
NSArray * newArray = [[original copy] autorelease];
我认为它的存在是为了方便你在适合自己风格的情况下使用。
original
是一个NSArray。但它可以是从NSArray派生出来的任何东西。而且对象的类可以实现自己的copy
。因此,[[original copy] autorelease];
不能保证返回一个NSArray。 - CoyoteGNUstep是GNU实现的OPENSTEP规范,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