【发布时间】:2010-11-26 09:19:29
【问题描述】:
我想看看它是如何创建一个数组的。如何查看显示其完成方式的 .m 文件?
【问题讨论】:
标签: iphone objective-c uikit nsmutablearray nsarray
我想看看它是如何创建一个数组的。如何查看显示其完成方式的 .m 文件?
【问题讨论】:
标签: iphone objective-c uikit nsmutablearray nsarray
正如@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];
我猜,请根据简洁性来选择你喜欢的那个:-)。
【讨论】:
不,Cocoa 不是开源的。
如果你有问题,你应该问它。
这将是一种有效的实现方式:
+ (id)arrayWithArray:(NSArray *)array {
return [[[self alloc] initWithArray:array] autorelease];
}
您可以阅读NSArray 的 GNUStep 源代码,但请注意,这是 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。
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
【讨论】: