Objective c 初始化NSMutableArray:[NSMutableArray];
如果您使用NSArray的上述便利方法初始化NSMutableArray,您会得到NSArray还是NSMutableArray 有什么后果吗Objective c 初始化NSMutableArray:[NSMutableArray];,objective-c,cocoa,cocoa-touch,Objective C,Cocoa,Cocoa Touch,如果您使用NSArray的上述便利方法初始化NSMutableArray,您会得到NSArray还是NSMutableArray 有什么后果吗 (我知道NSMutableArray有“arrayWithCapacity:,我很好奇)如果您使用以下方法初始化它: NSMutableArray *array = [NSMutableArray array]; Objective-C的一个重要特性是类方法由子类继承 因此,在类方法中,可以执行如下操作: +(id)array { return
(我知道NSMutableArray有“arrayWithCapacity:,我很好奇)如果您使用以下方法初始化它:
NSMutableArray *array = [NSMutableArray array];
Objective-C的一个重要特性是类方法由子类继承
因此,在类方法中,可以执行如下操作:
+(id)array {
return [[[self alloc] init] autorelease];
}
和
self
将引用执行代码的类对象(NSArray
或NSMutableArray
)。更新:,同时我建议“自己测试它”“总的来说,这是个好主意,在这种情况下有点容易触发。感谢Jim在评论中指出我下面的建议对这些类不起作用,因为各种形式的NSArray都是由CoreFoundation免费桥接类实现的
-----下面是上下文的原始答案-----
回答这样一个问题最简单的方法就是自己测试。尝试以您感兴趣的方式分配阵列,然后从代码中删除NSLog:
NSLog(@“我们得到了%@)”,NSStringFromClass([theArray类]) 啊,很有趣。因此,自引用类对象:NSMutableArray。这是有道理的。我想知道为什么我的密码没有被破解!我想你会这样做:返回[[self alloc]init]autorelease];当然,这总会有回报的。
NSCFArray
?很好,吉姆。我忘了NSArray的特殊性。编辑我上面的回复。谢谢,嗯。所以即使是NSMutableArray也会吐回NSFarray?这使得你很难在尝试改变一个可变的对象之前进行内省并找出它。我想在那种情况下你可以做些反应。顺便说一句,谢谢你的精彩播客。我回去听了你和曼顿过去的大部分插曲。非常有趣而且信息丰富。是的,使用respondsToSelector似乎是一种合理的方法。也许有更好的方法来检查易变性,我不知道。很高兴你喜欢播客!遗憾的是,这是不可能的。NSCFArray实现了一组方法,如果它恰好是一个可变实例,它不会更改该列表。时髦的免费桥接功能的所有部分:NSCFArray实际上是一个应用于CFArrayRef实例的ObjC类描述——换句话说,创建一个CFArrayRef,调用[ref class],然后它将返回NSCFArray。我所知道的可靠测试可变性的唯一方法是将其包装在try/catch块中,并处理nsinternalinconsistenceexception,如果它不是真正可变性的,则会引发该异常。或深入CF源并检查CF头位;)我很欣赏下面关于一个简单问题的有趣讨论。它带来了一些微妙的观点。