變更履曆
版本: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]];
以上代碼很好了解,沒什麼可說的。