Objective-C代码学习大纲(6)

时间:2022-11-02 16:49:13
2011-05-11 14:06 佚名 otierney 字号:T | T
Objective-C代码学习大纲(6)

本文为*出版的《Objective-C学习大纲》的翻译文档,系统介绍了Objective-C代码,很多名词为*同胞特指词汇,在学习时仔细研读才能体会。

AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载!

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. void print( NSArray *array ) {
  8. NSEnumerator *enumerator = [array objectEnumerator];
  9. id obj;
  10. while ( obj = [enumerator nextObject] ) {
  11. printf( "%s\n", [[obj description] cString] );
  12. }
  13. }
  14. int main( int argc, const char *argv[] ) {
  15. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  16. NSArray *arr = [[NSArray alloc] initWithObjects:
  17. @"Me", @"Myself", @"I", nil];
  18. NSMutableArray *mutable = [[NSMutableArray alloc] init];
  19. // enumerate over items
  20. printf( "----static array\n" );
  21. print( arr );
  22. // add stuff
  23. [mutable addObject: @"One"];
  24. [mutable addObject: @"Two"];
  25. [mutable addObjectsFromArray: arr];
  26. [mutable addObject: @"Three"];
  27. // print em
  28. printf( "----mutable array\n" );
  29. print( mutable );
  30. // sort then print
  31. printf( "----sorted mutable array\n" );
  32. [mutable sortUsingSelector: @selector( caseInsensitiveCompare: )];
  33. print( mutable );
  34. // free memory
  35. [arr release];
  36. [mutable release];
  37. [pool release];
  38. return 0;
  39. }

output

  1. ----static array
  2. Me
  3. Myself
  4. I
  5. ----mutable array
  6. One
  7. Two
  8. Me
  9. Myself
  10. I
  11. Three
  12. ----sorted mutable array
  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. void print( NSDictionary *map ) {
  9. NSEnumerator *enumerator = [map keyEnumerator];
  10. id key;
  11. while ( key = [enumerator nextObject] ) {
  12. printf( "%s => %s\n",
  13. [[key description] cString],
  14. [[[map objectForKey: key] description] cString] );
  15. }
  16. }
  17. int main( int argc, const char *argv[] ) {
  18. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  19. NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
  20. @"one", [NSNumber numberWithInt: 1],
  21. @"two", [NSNumber numberWithInt: 2],
  22. @"three", [NSNumber numberWithInt: 3],
  23. nil];
  24. NSMutableDictionary *mutable = [[NSMutableDictionary alloc] init];
  25. // print dictionary
  26. printf( "----static dictionary\n" );
  27. print( dictionary );
  28. // add objects
  29. [mutable setObject: @"Tom" forKey: @"tom@jones.com"];
  30. [mutable setObject: @"Bob" forKey: @"bob@dole.com" ];
  31. // print mutable dictionary
  32. printf( "----mutable dictionary\n" );
  33. print( mutable );
  34. // free memory
  35. [dictionary release];
  36. [mutable release];
  37. [pool release];
  38. return 0;
  39. }

output 

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

优点与缺点

优点

Cateogies

Posing

动态识别

指标计算

弹性讯息传递

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

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

缺点

不支援命名空间

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

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