Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 初始化NSMutableArray:[NSMutableArray];_Objective C_Cocoa_Cocoa Touch - Fatal编程技术网

Objective c 初始化NSMutableArray:[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

如果您使用NSArray的上述便利方法初始化NSMutableArray,您会得到NSArray还是NSMutableArray

有什么后果吗


(我知道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头位;)我很欣赏下面关于一个简单问题的有趣讨论。它带来了一些微妙的观点。