我们回顾一下,NSArray和NSDictionary只能存储对象,而不能直接存储任何基本类型的数据,如int、float和struct。不过,我们可以用对象来封装基本数值。如果我们想使用对象来处理基本类型,就可以使用NSInteger和NSUInteger。这些数据也要针对32位和64位处理器对数值进行统一。首先,让博主带大家先看一下用到的知识内容(有关Cocoa中的NSNumber、NSValue、NSNull类):
1、Cocoa提供了NSNumber类来封装(wrap,即以对象形式来实现)基本数据类型。我们可以使用下面类方法来创建新的NSNumber对象:
+(NSNumber *)numberWithChar:(char)value;
+(NSNumber *)numberWithInt:(int)value;
+(NSNumber *)numberWithFloat:(float)value;
+(NSNumber *)numberWithBoll:(BOOL)value;
以上使我们最常用的方法,还包括无符号整数,long型整数以及long long型整数据的版本。
当然,也可以使用字面量语法来创建这些对象:
NSNumber *number;
number = @'S';//字符型
number = @12345;//整型
number = @12345ul;//无符号长整数
number = @12345ll;//long long
number = @123.45f;//浮点型
number = @123.45;//双浮点型
number = @YES;//布尔值
在将一个基本类型数据封装到NSNumber中后,我们可以通过下面的实例方法来重新获得它:
-(char)charValue;
-(int)intValue;
-(float)floatValue;
-(BOOL)boolValue;
-(NSString *)stringValue;
现在,让博主和大家一起学习一下普及一下知识:
通常将一个基本类型的数据封装成对象的过程被称为装箱,从对象中提取基本类型的数据叫做开箱。有些语言有自动装箱的功能,可以自动封装基础类型的数据,也可以自动从封装后的对象中提取基础数据。Objective-C语言不支持自动装箱功能。
2、NSNumber实际上是NSValue的子类,NSValue可以封装任意值。我们可以使用NSValue将结构体放入NSArray和NSDictionary中。使用下面的类方法便能创建新的NSValue对象
+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
传递的参数是我们想要封装的数值的地址(如一个NSSize或我们自己的struct)。通常我们得到的是想要存储的变量的地址(在C语言要使用操作符&)。我们也可以提供一个用来描述这个数据类型的字符串,通常用来说明struct中实体的类型和大小。还好,我们不用自己写代码来生成这个字符串,@encode编译器指令可以接受数据类型的名称并为我们生成合适的字符串,如下的小程序例子。
可以用方法getValue:来提取数值:
-(void)getVslue:(void *)buffer;
小提示:在上面的getValue:方法中,我们可以看到方法名中是要不管了get,表明我们提供的是一个指针,而指针所指向的空间则用来存储该方法生成的数据。
Cocoa提供了常用的struct型数据NSValue相互转换的便捷方法:
+(NSValue *)valueWithPoint:(NSPoint)aPoint;
+(NSValue *)valueWithSize:(NSSize)size;
+(NSValue *)valueWithRect:(NSRect)rect;
-(NSPoint)pointValue;
-(NSSize)sizeValue;
-(NSRect)rectValue;
3、我们曾提过不能在集合中放入nil值,因为NSArray和NSDictionary中nil有特殊的意义,但有时你需要存储一个表示“这里什么都没有”的值,如下的程序应用。NSNull大概是Cocoa里最简单的类了,而且它只有一个方法:
+(NSNull *)null;
博主就分享一下学习NSNumber,NSValue,NSNull时自己编写的一些小程序:
#import <Foundation/Foundation.h>
@interface Xiaojin : NSObject
@end
@implementation Xiaojin
-(NSString *)description
{
return @"I am jinge";
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
//NSNumber的应用
NSMutableArray *array = [NSMutableArray arrayWithCapacity:20];
NSNumber *number;
number = @12;
[array addObject:number];
number = @13;
[array addObject:number];
number = @14;
[array addObject:number];
for(NSInteger i = 0;i < [array count];i++)
{
NSLog(@"index %ld has %@",(long)i,array[i]);
}
int n;
for(NSInteger i = 0;i < [array count];i++)
{
number = [array objectAtIndex:i];
n = [number intValue];
NSLog(@"The number(int) of the array[%ld] is %d",(long)i,n);
}
//NSValue的应用
NSMutableArray *arrays = [NSMutableArray arrayWithCapacity:20];
NSRect rect = NSMakeRect(1, 2, 30, 40);
NSValue *value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)];
[arrays addObject:value];
rect = NSMakeRect(2, 3, 40, 50);
value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)];
[arrays addObject:value];
rect = NSMakeRect(3, 4, 50, 60);
value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)];
[arrays addObject:value];
for(NSInteger i = 0;i < [arrays count];i++)
{
value = [arrays objectAtIndex:i];
[value getValue:&rect];
NSLog(@"x = %f,y = %f,width = %f,height = %f",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
}
//NSNull的应用
Xiaojin *t = [Xiaojin new];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:20];
[dictionary setObject:[NSNull null] forKey:@"xiaojin"];
[dictionary setObject:t forKey:@"jinge"];
id xiaojinfax = [dictionary objectForKey:@"xiaojin"];
if(xiaojinfax == [NSNull null])
{
NSLog(@"no xiaojin");
}
}
return 0;
}
这段程序代码运行结果截图:
这是博主学习NSNumber、NSValue和NSNull类时看的内容以及自己写的小程序,做到通过练习来巩固知识。谢谢读者们的阅览,有重要的补充和不足也希望能提出。