#iphone #objective-c #ios #nsarray #nsobject
#iPhone #objective-c #iOS #nsarray #nsobject
Вопрос:
Что такое __NSArrayI и __NSArrayM?
__NSArrayI (или M) вызывает ошибку «нераспознанный селектор».
Как преобразовать в NSArray?
Я провел тест для анализа json, api twitter.
http://api.twitter.com/1/followers/ids.json?cursor=-1amp;screen_name=twitterapi
==> работает нормально. анализируемый объект — это класс NSCFDictionary. (Этот словарь содержит класс __NSArrayM)
http://api.twitter.com/1/statuses/user_timeline.json?amp;screen_name=twitterapi
==> ошибка. анализируемый объект — это класс __NSArrayM.
Комментарии:
1. Опубликуйте код, который выдает ошибку.
2. __NSArrayI => Неизменяемый NSArray __NSArrayM => Изменяемый NSArray
3. Также отправьте нераспознанное сообщение селектора.
Ответ №1:
__NSArrayI
это кодовое слово для неизменяемого массива, то есть «обычного» NSArray
, которое вы не можете изменить.
__NSArrayM
это кодовое слово для изменяемого массива, то есть NSMutableArray
. В NSMutableArray
вы можете добавлять и удалять элементы.
Комментарии:
1. Приятно — где вы находите эти знания? Просто напрямую прочитав исходный код среды выполнения? Или где-то есть какие-то документы.
2. Имена являются хорошей подсказкой («M» и «I» в контексте массивов могут означать только изменяемые и неизменяемые), но лучший способ — проверить объекты, которые, как вы знаете, являются NSArrays, с помощью object_getClass() .
3. @Catfish_Man шесть
Ответ №2:
Это классы частного api. Есть проект, где вы можете увидеть все классы частного api. Вам не разрешено использовать их внутри приложения для app store
, но иногда полезно также посмотреть, как получить доступ к объектам, а также что это за объект. Они не могут быть преобразованы. Я думаю, что получение таких объектов внутри отладчика — это просто представление внутренних классов для классов, которые вы используете внутри своего проекта. Знание того, что это за класс, позволяет вам также понять, где искать проблему внутри вашего кода.
Здесь вы можете увидеть краткий обзор обоих:
__NSArrayI
__NSArrayM
Ответ №3:
Это частные классы. Вы не должны хотеть получать к ним доступ или, тем более, конвертировать их.
Если я не ошибаюсь NSArray
, это подкласс of _NSArray
.
Если вы добавляете / удаляете некоторые объекты в / из своего массива, убедитесь, что он имеет изменяемый тип : NSMutableArray