【问题标题】:What is __NSArrayI and __NSArrayM? How to convert to NSArray?__NSArrayI 和 __NSArrayM 是什么?如何转换为 NSArray?
【发布时间】:2023-03-15 04:50:01
【问题描述】:

什么是__NSArrayI 和__NSArrayM?

__NSArrayI(or M) 导致“无法识别的选择器”错误。

如何转换成NSArray?


我做了测试来解析 json,twitter api。

http://api.twitter.com/1/followers/ids.json?cursor=-1&screen_name=twitterapi

==> 工作正常。解析的对象是 NSCFDictionary 类。 (此字典包含__NSArrayM 类)

http://api.twitter.com/1/statuses/user_timeline.json?&screen_name=twitterapi

==> 错误。解析的对象是 __NSArrayM 类。

【问题讨论】:

  • 贴出出错的代码。
  • __NSArrayI => 不可变 NSArray __NSArrayM => 可变 NSArray
  • 同时发布无法识别的选择器消息。

标签: iphone objective-c ios nsarray nsobject


【解决方案1】:

这些是私有 api 的类。在is a project 可以看到私有api 的所有类。您不能在应用程序中为app store 使用它们,但有时查看如何访问对象以及它是什么类型的对象也很有用。它们无法转换。我认为,在调试器中获取这些对象只是内部类的表示,对于您在项目中使用的类。知道它是什么类型的类,还可以让您了解在代码中的何处查找问题。

在这里您可以看到两者的简短查找:

__NSArrayI

__NSArrayM

【讨论】:

    【解决方案2】:

    __NSArrayI 是不可变数组的代码字,即您无法更改的“常规”NSArray

    __NSArrayM 是可变数组的代码字,即NSMutableArray。在NSMutableArray,你可以添加和删除项目。

    【讨论】:

    • 很好——你在哪里找到这些知识?通过直接读取运行时的源代码?或者某处是否有某种文档。
    • 名称是一个很好的线索(数组上下文中的“M”和“I”意义不大,但可变和不可变),但最好的方法是检查您知道的对象使用 object_getClass() 成为 NSArrays。
    • @Catfish_Man 六
    【解决方案3】:

    这是私人课程。你不应该想要访问它们,或者转换它们。

    如果我没记错的话,NSArray_NSArray 的子类。

    如果您在数组中添加/删除一些对象,请检查它是否属于可变类型:NSMutableArray

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2011-06-01
      • 2010-12-18
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多