A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© yanggangcl 中级黑马   /  2015-11-6 09:35  /  659 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们知道NSNumber可以用来封装基本数据类型:
  1. NSNumber *n = @100;
  2.         NSNumber *n2 = @3.14;
  3.         NSNumber *n3 = @'T';
复制代码

求其类的话:
  1. NSLog(@"%@", [n class]);
  2.         NSLog(@"%@", [n2 class]);
  3.         NSLog(@"%@", [n3 class]);
复制代码

结果为:
  1. 2015-11-06 09:33:58.707 OCTest[784:33122] __NSCFNumber
  2. 2015-11-06 09:33:58.708 OCTest[784:33122] __NSCFNumber
  3. 2015-11-06 09:33:58.708 OCTest[784:33122] __NSCFNumber
复制代码

虽然__NSCFNumber不等于NSNumber,但也可以推测是别名而已。
但很诡异的是:
  1. NSNumber *b = @YES;

  2. NSLog(@"%@", [@100 class]);
  3. NSLog(@"%@", [@YES class]);
复制代码

结果却是:
  1. 2015-11-06 09:33:58.708 OCTest[784:33122] __NSCFBoolean
  2. 2015-11-06 09:33:58.708 OCTest[784:33122] __NSCFBoolean
复制代码

__NSCFBoolean长得和NSNumber也差得太远了,不可能还是别名吧,那为什么呢?
原来 一直以来,我们都以为NSNumber将原始数封装为对象表示。其它任何由integer-和float-衍生出来的NSNumber对象都显示它的类为__NSCFNumber。NSCFBoolean是NSNumber类簇中的一个私有的类。它被用来给Core Foundation的属性列表和集合封装布尔数值。CFBoolean定义了常量kCFBooleanTrue和kCFBooleanFalse。而CFNumberRef和CFBooleanRef在Core Foundation中属于不同种类,它们在NSNumber被以不同的衔接类呈现。

1 个回复

倒序浏览
改正:
“NSLog(@"%@", [@100 class]);”    ----->    NSLog(@"%@", [b class]);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马