• NSNumber NSValue NSNull


    NSArray和NSDictionary只能存储对象,不能直接存储基本类型,如int、float 等...。但可以用对象来封装基本数值。

    例如,将int型数据封装到一个对象中,然后就可以将这个对象放入NSArray或NSDictionary中了。

    类似java中的封箱.


    1)NSNumber
    Cocoa提供了NSNumber类来包装(即以对象形式实现)基本数据类型。
    例如以下创建方法: 

    1. + (NSNumber *) numberWithChar: (char) value;
    2. + (NSNumber *) numberWithInt: (int) value;
    3. + (NSNumber *) numberWithFloat: (float) value;
    4. + (NSNumber *) numberWithBool: (BOOL) value;


    将基本类型数据封装到NSNumber中后,就可以通过下面的实例方法重新获取它: 

    1. - (char) charValue;
    2. - (int) intValue;
    3. - (float) floatValue;
    4. - (BOOL) boolValue;
    5. - (NSString *) stringValue;


    术语:将一个基本类型的数据包装成对象叫做装箱(boxing),从对象中提取基本类型的数据叫做取消装箱或拆箱(unboxing)。Objective-C不支持自动装箱。


    2)NSValue
    NSNumber实际上是NSValue的子类,NSValue可以包装任意值。可使用下面的类方法创建新的NSValue: 

    1. + (NSValue *) valueWithBytes: (const void *) value
    2.             objCType: (const char *) type;


    传递的参数是你想要包装的数值的地址(如一个NSSize或你自己的struct),通常得到的是你想要存储的变量的地址(在C语言中使用操作符&).你也可以提供一个用来描述这个数据类型的字符串(参数objCType),通常用来说明struct中实体的类型和大小。不需要自己写这个字符串,@encode编译器指令可以接收数据类型的名称并生成合适的字符串。所以按照如下方式把NSRect放入NSArray中: 

    1. // 将NSRect放入NSArray中
    2.     NSRect rect = NSMakeRect(1, 2, 100, 200);
    3.     NSValue *rectValue = [NSValue valueWithBytes:&rect
    4.                         objCType:@encode(NSRect)];
    5.     [array addObject:rectValue];
    6.   
    7.     // 使用getValue提取数值
    8.     // 传递参数为要存储这个数值的变量的地址
    9.     rectValue = [array objectAtIndex: 0];
    10.     [rectValue getValue:&rect];


    在上面的getValue: 例子中,方法名中的get表明我们提供的是一个指针,而指针所指向的空间用来存储该方法生成的数据。
    Cocoa提供了将常用的struct型数据转换成NSValue的便捷方法: 

    1. + (NSValue *) valueWithPoint: (NSPoint) point;
    2. + (NSValue *) valueWithSIze: (NSSize) size;
    3. + (NSValue *) valueWithRect: (NSRect) rect;
    1. - (NSPoint) pointValue;
    2. - (NSSize) sizeValue;
    3. - (NSRect) rectValue;


    例如: 

    1. value = [NSValue valueWithRect: rect];
    2. [array addObject: value];
    3. // ….
    4. NSRect anotherRect = [value rectValue];

    3)NSNull
    因为在NSArray和NSDictionary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nil值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类。NSNull只有一个方法: 

    1. + (NSNull *) null;


    例如:

    1. [contact setObject: [NSNull null] forKey: @"home fax"];

    访问如下:

      1. id homefax;
      2. homefax = [contact objectForKey: @"home fax"];
      3. if (homefax == [NSNull null]
      4. {
      5.     //...
      6. }
  • 相关阅读:
    【解题报告】2019正睿Day2
    如何卡SPFA
    【游记】2019国庆清北刷题营
    CF427D Match & Catch
    P2178 [NOI2015] 品酒大会
    Loj#6071. 「2017 山东一轮集训 Day5」字符串
    SP8093 JZPGYZ
    P3346 [ZJOI2015]诸神眷顾的幻想乡
    CF1037H Security
    CF932F Escape Through Leaf
  • 原文地址:https://www.cnblogs.com/mohe/p/2961112.html
Copyright © 2020-2023  润新知