object-c 四

Foundation framework classes

Foundation framework 地位如同 C++ 的 Standard Template Library。不过 Objective-C 是真正的动态识别语言(dynamic types),所以不需要像 C++ 那样肥得可怕的样版(templates)。这个 framework 包含了物件组、网路、执行绪,还有更多好东西。

NSArray

 
  1. main.m
  2. #import
  3. #import
  4. #import
  5. #import
  6. #import
  7. voidprint(NSArray*array){
  8. NSEnumerator*enumerator=[arrayobjectEnumerator];
  9. idobj;
  10. while(obj=[enumeratornextObject]){
  11. printf("%s\n",[[objdescription]cString]);
  12. }
  13. }
  14. intmain(intargc,constchar*argv[]){
  15. NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
  16. NSArray*arr=[[NSArrayalloc]initWithObjects:
  17. @"Me",@"Myself",@"I",nil];
  18. NSMutableArray*mutable=[[NSMutableArrayalloc]init];
  19. //enumerateoveritems
  20. printf("----staticarray\n");
  21. print(arr);
  22. //addstuff
  23. [mutableaddObject:@"One"];
  24. [mutableaddObject:@"Two"];
  25. [mutableaddObjectsFromArray:arr];
  26. [mutableaddObject:@"Three"];
  27. //printem
  28. printf("----mutablearray\n");
  29. print(mutable);
  30. //sortthenprint
  31. printf("----sortedmutablearray\n");
  32. [mutablesortUsingSelector:@selector(caseInsensitiveCompare:)];
  33. print(mutable);
  34. //freememory
  35. [arrrelease];
  36. [mutablerelease];
  37. [poolrelease];
  38. return0;
  39. }

output

 
  1. ----staticarray
  2. Me
  3. Myself
  4. I
  5. ----mutablearray
  6. One
  7. Two
  8. Me
  9. Myself
  10. I
  11. Three
  12. ----sortedmutablearray
  13. I
  14. Me
  15. Myself
  16. One
  17. Three
  18. 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

 
  1. main.m
  2. #import
  3. #import
  4. #import
  5. #import
  6. #import<<>
  7. #import
  8. voidprint(NSDictionary*map){
  9. NSEnumerator*enumerator=[mapkeyEnumerator];
  10. idkey;
  11. while(key=[enumeratornextObject]){
  12. printf("%s=>%s\n",
  13. [[keydescription]cString],
  14. [[[mapobjectForKey:key]description]cString]);
  15. }
  16. }
  17. intmain(intargc,constchar*argv[]){
  18. NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
  19. NSDictionary*dictionary=[[NSDictionaryalloc]initWithObjectsAndKeys:
  20. @"one",[NSNumbernumberWithInt:1],
  21. @"two",[NSNumbernumberWithInt:2],
  22. @"three",[NSNumbernumberWithInt:3],
  23. nil];
  24. NSMutableDictionary*mutable=[[NSMutableDictionaryalloc]init];
  25. //printdictionary
  26. printf("----staticdictionary\n");
  27. print(dictionary);
  28. //addobjects
  29. [mutablesetObject:@"Tom"forKey:@"tom@jones.com"];
  30. [mutablesetObject:@"Bob"forKey:@"bob@dole.com"];
  31. //printmutabledictionary
  32. printf("----mutabledictionary\n");
  33. print(mutable);
  34. //freememory
  35. [dictionaryrelease];
  36. [mutablerelease];
  37. [poolrelease];
  38. return0;
  39. }

output

 
  1. ----staticdictionary
  2. 1=>one
  3. 2=>two
  4. 3=>three
  5. ----mutabledictionary
  6. bob@dole.com=>Bob
  7. tom@jones.com=>Tom

优点与缺点

优点

Cateogies

Posing

动态识别

指标计算

弹性讯息传递

不是一个过度复杂的 C 衍生语言

可透过 Objective-C++ 与 C++ 结合

缺点

不支援命名空间

不支援运算子多载(虽然这常常被视为一个优点,不过正确地使用运算子多载可以降低程式码复杂度)

语言裡仍然有些讨厌的东西,不过不比 C++ 多。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值