Objective-C 2.0 学习笔记十一(Number, Strings, and Collections)

来源:互联网 发布:软件开发知识产权归属 编辑:程序博客网 时间:2024/05/14 20:11

变更履历

版本: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]];

以上代码很好理解,没什么可说的。


原创粉丝点击