变更履历
版本:v1.0
介绍
本节记录了Foundation框架提供的一些基本对象。这些基本对象包括数字、字符串和集合。集合指的是数组(arrays)、字典(dictionaries)和集(sets)。
Number Objects
基本类型不是对象,不仅是 OC,在 Java 中也是这样。在 NSArray 这样的类中是不能使用基本数据类型的,这时我们可以使用 NSNumber 类,它可以存储任何基本数据类型(包括char)。下面是一个例子:
#import <Foundation/Foundation.h>
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSNumber *myNumber, *floatNumber, *intNumber;
NSInteger myInt;
// integer value
//
intNumber = [NSNumber numberWithInteger: 100];
myInt = [intNumber integerValue];
NSLog(@"%li", (long) myInt);
// long value
//
myNumber = [NSNumber numberWithLong: 0xabcdef];
NSLog(@"%lx", (long) myNumber);
// char value
//
myNumber = [NSNumber numberWithLong: 'X'];
NSLog(@"%c", [myNumber charValue]);
// float value
floatNumber = [NSNumber numberWithFloat: 100.00];
NSLog(@"%g", [floatNumber floatValue]);
// double
//
myNumber = [NSNumber numberWithDouble: 12345e+15];
NSLog(@"%lg", [myNumber doubleValue]);
// Wrong access here
//
NSLog(@"%li", (long) [myNumber integerValue]);
// Test two Numbers for equality
//
if ( [intNumber isEqualToNumber: floatNumber] == YES )
NSLog(@"Number are equal");
else
NSLog(@"Number are not equal");
// Test if one Number is <, ==, or > second Number
//
if ( [intNumber compare: myNumber] == NSOrderedAscending )
NSLog(@"First number is less than second");
[pool drain];
return 0;
}
NSInteger 不是类,而是基本数据类型的 typedef。有可能是 64 位的 long;也可能是 32 位的 int。
下表列出了 NSNumber 对象设置值的类方法、实例方法,以及检索这些值的实例方法:
String Objects
NSString 用于处理字符串对象。NSString 对象由 unichar 字符组成。Unichar 是符合 Unicode 标准的多字节字符。
More on the NSLog Function
输出 NSString 对象
NSString *str = @"Programming is fun.";
NSLog(@"%@", str);
NSNumber 对象也可以使用 %@ 来输出
NSLog (@"%@", intNumber);
The description Method
description 方法与 Java 的 toString 方法一样。重写它可以让我们在调用 NSLog 时显示任何我们想要的内容。
下面是 NSString 类的 description 方法定义:
-(NSString *) description
{
return [NSString stringWithFormat: @"%i/%i", numerator, denominator];
}
可变对象 vs 不可变对象(Mutable Versus Immutable Objects)
NSString 与 Java 的 String 类型是一样的,创建的都是不可变对象。所谓不可变就是不能在这个对象实例中更改值,所作的任何更改都会产生新的对象。
不可变对象的好处
1、更好的性能,在 Java 中,存在一个称为常量池的内存区域,所有常量字符串都存储在这个区域,当新的String实例创建时,会首先去这个内存区域中查找是否存在相同的字符串常量,如果有,则将新String实例的指针指向这块内存。如果没有,则创建新的内存存储字符串常量。
2、线程安全,在多线程中,不可变对象是线程安全的。
3、安全检查
4、hashCode
5、类加载机制,类名也是字符串。
6、操作的便利性
使用一个字符串创建新的字符串:
res = [NSString stringWithString: str1];
连接两个字符串
res = [str1 stringByAppendingString: str2];
使用 isEqualToString 比较两个字符串是否相等:
if ([str1 isEqualToString: res] == YES)
...
使用 compare 比较两个字符串是否相等(大小写敏感):
NSComparisonResult compareResult = [str1 compare: str2];
使用 compare 比较两个字符串是否相等(大小写不敏感):
NSComparisonResult compareResult = [str1 caseInsensitiveCompare: str2];
字符串比较结果
使用 compare 或 caseInsensitiveCompare 比较字符串有三个结果:
- NSOrderedAscending 第一个字符串小于第二个字符串。
- NSOrderedSame 相等。
- NSOrderedDescending 第一个字符串大于第二个字符串。
转换为大写
res = [str1 uppercaseString];
转换为小写
res = [str1 lowercaseString];
NSRange 类型
NSRange 类型用来指定范围,NSString 中的一些方法会用到。NSRange 定义有两个成员 location 和 length。location 是起始索引数;length 是字符计数。
substringToIndex
创建一个子字符串,从首字符 0 开始,执行到索引数。
substringFromIndex
创建一个子字符串,从指定的索引开始,直到字母末尾。
substringWithRange
接收一个范围,并返回指定范围的字符,NSMakeRange 函数用于创建一个
NSRange,这个结果可以作为
substringWithRange:方法的参数。
NSMakeRange(8, 6);
rangeOfString
在一个字符串中查找字符串。返回
NSRange 类型可以精确地指出字符串的位置。如果没有找到,则
NSRange 的 location 被设置为
NSNotFound。
range = [str rangeOfString: @"string"];
可变字符串
NSMutableString 用于创建可更改字符的字符串对象。它是 NSString 的子类。
一些 NSString 和 NSMutableString 的常用方法
数组对象
Foundation 数组是有序的对象集合。数组也存在可变数组和不可变数组。NSArray 是不可变数组;NSMutableArray 是可变数组。另外,NSArray 和 NSMutableArray 只能存储对象,简单类型是不可以的。
一下代码用于创建一个数组
[NSArray arrayWithObjects:@"January", @"February", @"March", @"April", ..., @"December", nil]
arrayWithObjects 方法可接受可变数目的参数。要标记参数列表的结束,最后一个值必须指定为 nil。
for ( i = 0; i < 12; i++ )
NSLog(@"%2i %@", i + 1, [monthName objectAtIndex:i]);
objectAtIndex 用于遍历数组,数组下标从0开始。
由于数组只能存储对象,所以,对于基本类型来说,需要使用对象类型,比如 NSNumber 可以用来存储整数。
NSMutableArray *primes = [NSMutableArray arrayWithCapacity: 20];
[primes addObject: [NSNumber numberWithInteger:2]];
[primes addObject: [NSNumber numberWithInteger:3]];
以上代码很好理解,没什么可说的。