我想看看它是如何创建数组的。如何查看显示如何完成的.m文件?
答案 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