Цель C Самоанализ - PullRequest
       4

Цель C Самоанализ

0 голосов
/ 06 ноября 2011

При выполнении самоанализа в классе я использую следующий код:

if([object isKindOfClass:[NSNumber class]]){

        NSLog(@"I am an NSNumber: %@", object);
    }

 NSLog(@"Properties:%@", [object class]);

Вывод:

I am an NSNumber: 320
Properties:__NSCFNumber

Может кто-нибудь объяснить, почему результатом является __NSCFNumber для типа NSNumber? Я также заметил, что NSArray идентифицируется как:

__NSArrayI

Ответы [ 3 ]

6 голосов
/ 06 ноября 2011

NSNumber - это кластер класса . NSNumber - это абстрактный, открытый суперкласс нескольких конкретных подклассов. Когда вы создаете NSNumber с помощью любого из методов +numberWith..., вы получите экземпляр одного из этих подклассов.

Когда вы передаете объект в NSLog () в качестве параметра, соответствующего спецификатору хранилища "% ​​@", NSLog() отправит этому объекту сообщение -description и вставит все, что возвращено из этого выражения сообщения, в строку, которую он записывает в дескриптор файла stderr.

4 голосов
/ 06 ноября 2011

__NSCFNumber является частным подклассом из NSNumber.Вам не нужно беспокоиться о том, какой конкретный класс используется внутри, это детали реализации, которые ОС использует для повышения производительности.

Существует ряд классов, которые используют этот шаблон (он называется Класс Cluster ), включая NSString и NSArray.

Не рекомендуется слишком глубоко изучать, какой фактический тип используется, поскольку типы / реализации могут (и могут) часто изменяться.Просто воспринимайте это как NSNumber, и с вами все будет в порядке!

0 голосов
/ 06 ноября 2011

Я не могу прямо ответить на ваш вопрос, могу вам сказать, что вы могли бы сделать это:

NSLog@"Class name: %@.", NSStringFromClass([object class]); 

И вы получите:

Class name: NSNumber.

Это тебе поможет?

...