【问题标题】:Initialize NSMutableArray: [NSMutableArray array];初始化 NSMutableArray:[NSMutableArray 数组];
【发布时间】:2009-05-09 22:16:13
【问题描述】:

如果你用上面提到的 NSArray 的便捷方法初始化一个 NSMutableArray,你会得到一个 NSArray 还是一个 NSMutableArray?

有什么后果吗?

(我知道 NSMutableArray 有“arrayWithCapacity:,我只是好奇)

【问题讨论】:

  • 我很欣赏下面对一个简单问题的有趣讨论。它带来了一些微妙的可可点。

标签: objective-c cocoa cocoa-touch


【解决方案1】:

如果您使用以下方法对其进行初始化:

NSMutableArray *array = [NSMutableArray array];

你得到一个 NSMutableArray。 Objective-C 的一大特点是类方法由子类继承。

所以,在类方法中你可以这样做:

+(id)array {
    return [[[self alloc] init] autorelease];
}

而self 将引用执行代码的类对象(NSArray 或NSMutableArray)。

【讨论】:

  • 啊,有趣。所以自我引用了类对象:NSMutableArray。这就说得通了。我想知道为什么我的代码没有破坏!
  • 我认为你实际上会这样做:return [[[self alloc] init] autorelease];
【解决方案2】:

更新:虽然我的“自己测试”的建议通常是一个好主意,但在这种情况下它有点触发快乐。感谢 cmets 中的 Jim 指出我下面的建议不适用于这些类,因为各种形式的 NSArray 都是由 CoreFoundation 免费桥接类实现的。

----- 以下上下文的原始答案-----

回答此类问题的最简单方法是自己进行测试。尝试以您感兴趣的方式分配数组,然后从您的代码中分配 NSLog:

NSLog(@"We got a %@", NSStringFromClass([theArray class]));

【讨论】:

  • 肯定会返回NSCFArray?
  • 好点,吉姆。我忘记了 NSArray 的特性。编辑我上面的回复。谢谢。
  • 嗯,很有趣。所以即使是 NSMutableArray 也会吐回 NSCFArray?这使得在尝试更改之前很难进行自省并找出是否有可变对象。我想你可以在这种情况下做 respondsToSelector 。顺便说一句,感谢您的精彩播客。我回去听了你和曼顿过去的大部分剧集。非常有趣且内容丰富。
  • 是的,使用 respondsToSelector 似乎是一种合理的方法。也许有更好的方法来检查可变性,我不知道。很高兴您喜欢播客!
  • 遗憾的是这是不可能的。 NSCFArray 实现了一组方法,如果它碰巧是一个可变实例,它不会改变该列表。所有时髦的免费桥接东西的一部分:NSCFArray 实际上是一个应用于 CFArrayRef 实例的 ObjC 类描述——换句话说,创建一个 CFArrayRef,调用 [ref 类],它会返回 NSCFArray。我知道可靠地测试可变性的唯一方法是将它包装在一个 try/catch 块中并处理如果它不是真正可变的将引发的 NSInternalInconsistencyException 。或者深入研究 CF 源并检查 CF 标头位;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
相关资源
最近更新 更多