我想看看它是如何创建一个数组的。如何查看显示其完成方式的 .m 文件?
问问题
13234 次
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 回答