Базовые объекты (AFAIK) имеют некоторые общие характеристики: все они реализуют протокол NSCoding, все они могут входить в PList и т. Д.
Ни то, ни другое не является правдой. Только некоторые классы соответствуют NSCoding
, не все из которых находятся в Foundation, и только несколько избранных классов являются классами списка свойств.
Вы, конечно, можете сгенерировать plist из объекта, используя один из архиваторов Apple, но тогда объект должен соответствовать NSCoding
- см. Выше.
Так, например, если бы я хотел заархивировать граф объектов на диск, было бы полезно убедиться, что любые объекты, которые я добавляю в граф объектов, являются либо объектами Foundation, либо моими пользовательскими объектами, в которых я реализовал NSCoding на…
Вы можете проверить, соответствует ли объект NSCoding
с помощью [someObject conformsToProtocol:@protocol(NSCoding)]
.
Если вам нужно проверить, является ли объект объектом списка свойств, вы должны будете это сделать, протестировав членство в классе, как вы показали в своем вопросе. Такой тест будет включать объекты базового списка свойств Core Foundation, и это правильно: объекты списка свойств CF в списке свойств так же действительны, как и их аналоги Foundation, в основном потому, что объекты списка свойств CF и Cocoa являются взаимозаменяемыми (из-за бесплатный телефонный мост).
Полный список допустимых классов списка свойств содержится в Руководстве по программированию списка свойств и Темы программирования списка свойств для Core Foundation . Конечно, имена классов различны (CFString и NSString), но из-за бесплатного моста они взаимозаменяемы.
Для всех намерений и целей NSString является CFString и наоборот, и то же самое для любой другой пары классов с бесплатными мостовыми соединениями. Бесполезно думать о «NSStrings vs. CFStrings»; вместо этого помните, что это одно и то же , и относитесь к ним как к такому.
Проблема в том, что я написал в коде, который преобразует словарь в строку параметров URL, используя строку формата со спецификатором% @, но я не хочу, чтобы туда входили произвольные объекты потому что я не хочу адреса памяти в моих параметрах URL ...
Это допустимый случай для тестирования членства в классе.
//convert dictionary into url params string
if ([key isKindOfClass:[NSString class]] && ([obj isKindOfClass:[NSString class]] || [obj isKindOfClass:[NSNumber class]])) {
[tempPost appendFormat:@"%@=%@&", key, obj];
}
Таким образом, вы найдете &
в конце вашего URL.
Ранее я описал спецификацию для объекта, который форматирует строки URL-запроса . Вы можете включить свои тесты членства в классе в свою реализацию этого объекта.