Foundation framework classes
Foundation framework 地位如同 C++ 的 Standard Template Library。不过 Objective-C 是真正的动态识别语言(dynamic types),所以不需要像 C++ 那样肥得可怕的样版(templates)。这个 framework 包含了物件组、网路、执行绪,还有更多好东西。
NSArray
- main.m
- #import
- #import
- #import
- #import
- #import
- voidprint(NSArray*array){
- NSEnumerator*enumerator=[arrayobjectEnumerator];
- idobj;
- while(obj=[enumeratornextObject]){
- printf("%s\n",[[objdescription]cString]);
- }
- }
- intmain(intargc,constchar*argv[]){
- NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
- NSArray*arr=[[NSArrayalloc]initWithObjects:
- @"Me",@"Myself",@"I",nil];
- NSMutableArray*mutable=[[NSMutableArrayalloc]init];
- //enumerateoveritems
- printf("----staticarray\n");
- print(arr);
- //addstuff
- [mutableaddObject:@"One"];
- [mutableaddObject:@"Two"];
- [mutableaddObjectsFromArray:arr];
- [mutableaddObject:@"Three"];
- //printem
- printf("----mutablearray\n");
- print(mutable);
- //sortthenprint
- printf("----sortedmutablearray\n");
- [mutablesortUsingSelector:@selector(caseInsensitiveCompare:)];
- print(mutable);
- //freememory
- [arrrelease];
- [mutablerelease];
- [poolrelease];
- return0;
- }
output
- ----staticarray
- Me
- Myself
- I
- ----mutablearray
- One
- Two
- Me
- Myself
- I
- Three
- ----sortedmutablearray
- I
- Me
- Myself
- One
- Three
- Two
阵列有两种(通常是 Foundation classes 中最资料导向的部分),NSArray 跟 NSMutableArray,顾名思义,mutable(善变的)表示可以被改变,而 NSArray 则不行。这表示你可以製造一个 NSArray 但却不能改变它的长度。
你可以用 Obj, Obj, Obj, ..., nil 为参数唿叫建构子来初始化一个阵列,其中 nil 表示结尾符号。
排序(sorting)展示如何用 selector 来排序一个物件,这个 selector 告诉阵列用 NSString 的忽略大小写顺序来排序。如果你的物件有好几个排序方法,你可以使用这个 selector 来选择你想用的方法。
在 print method 裡,我使用了 description method。它就像 Java 的 toString,会回传物件的 NSString 表示法。
NSEnumerator 很像 Java 的列举系统。while ( obj = [array objectEnumerator] ) 行得通的理由是 objectEnumerator 会回传最后一个物件的 nil。在 C 裡 nil 通常代表 0,也就是 false。改用 ( ( obj = [array objectEnumerator] ) != nil ) 也许更好。
NSDictionary
- main.m
- #import
- #import
- #import
- #import
- #import<<>
- #import
- voidprint(NSDictionary*map){
- NSEnumerator*enumerator=[mapkeyEnumerator];
- idkey;
- while(key=[enumeratornextObject]){
- printf("%s=>%s\n",
- [[keydescription]cString],
- [[[mapobjectForKey:key]description]cString]);
- }
- }
- intmain(intargc,constchar*argv[]){
- NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
- NSDictionary*dictionary=[[NSDictionaryalloc]initWithObjectsAndKeys:
- @"one",[NSNumbernumberWithInt:1],
- @"two",[NSNumbernumberWithInt:2],
- @"three",[NSNumbernumberWithInt:3],
- nil];
- NSMutableDictionary*mutable=[[NSMutableDictionaryalloc]init];
- //printdictionary
- printf("----staticdictionary\n");
- print(dictionary);
- //addobjects
- [mutablesetObject:@"Tom"forKey:@"tom@jones.com"];
- [mutablesetObject:@"Bob"forKey:@"bob@dole.com"];
- //printmutabledictionary
- printf("----mutabledictionary\n");
- print(mutable);
- //freememory
- [dictionaryrelease];
- [mutablerelease];
- [poolrelease];
- return0;
- }
output
- ----staticdictionary
- 1=>one
- 2=>two
- 3=>three
- ----mutabledictionary
- bob@dole.com=>Bob
- tom@jones.com=>Tom
优点与缺点
优点
Cateogies
Posing
动态识别
指标计算
弹性讯息传递
不是一个过度复杂的 C 衍生语言
可透过 Objective-C++ 与 C++ 结合
缺点
不支援命名空间
不支援运算子多载(虽然这常常被视为一个优点,不过正确地使用运算子多载可以降低程式码复杂度)
语言裡仍然有些讨厌的东西,不过不比 C++ 多。