1、分类(category)
使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到,这点和javascript中使用原型来定义属性有点类似。
我们可以为一个类创建一个新的方法,而不需要在代码中编辑类定义。
下面就是定义并使用分类的例子程序,通过下面代码,我们可以给Object-C中的NSString 添加camelCaseString分类,使用camelCaseString方法,就可以去掉一个字符串中的空格,并将原有空格后的单词改写成大写(即将字符串转化为驼峰式)。
1. #import <Foundation/Foundation.h>
2.
3. /*
4. 定义分类的过程大致可分为以下几个步骤:
5. 第一步、创建一个带有接口的新文件,即创建已有类
6.
7. 第二步、在新文件中添加需要扩展的方法及方法的实现,即需要添加的分类
8. */
9. //NSString 表示将要添加分类的类名称,该类必须是已存在的。
10. //CamelCase 是为类添加的方法名称。
11. //只能添加方法,不能添加变量。
12. //头文件命名惯例:ClassName+CategoryName.h
13. @interface NSString (CamelCase)
14.
15. -(NSString*) camelCaseString;
16.
17. @end
18.
19. @implementation NSString (CamelCase)
20.
21. -(NSString*) camelCaseString
22. {
23. //调用NSString的内部方法获取驼峰字符串。
24. //self指向被添加分类的类。
25. NSString *castr = [self capitalizedString];
26.
27. //创建数组来过滤掉空格, 通过分隔符对字符进行组合。
28. NSArray *array = [castr componentsSeparatedByCharactersInSet:
29. [NSCharacterSet whitespaceCharacterSet]];
30.
31. //把数组的字符输出
32. "";
33. for(NSString *word in array)
34. {
35. output = [output stringByAppendingString:word];
36. }
37.
38. return output;
39.
40. }
41.
42. @end
43. int main (int argc, const char * argv[])
44. {
45.
46. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
47.
48. "My name is bill.";
49. "%@", str);
50. str = [str camelCaseString];
51. "%@", str);
52.
53. [pool drain];
54. return 0;
55. }
2、扩展(Extension)
关于扩展,你可以这样理解:扩展是一种匿名分类;但是和匿名分类不一样的是,扩展可以添加新的实例变量(是不是觉得扩展已经强大到非一般的地步了? ^_^)
从Xcode 4 之后就推荐在自定义类的.m文件中使用扩展,这样就能保证良好的代码封装性,避免把私有接口暴露给外面。
下面是一个扩展的例子:
1. @interface MyClass : NSObject
2. - (float)value;
3. @end
4.
5.
6. @interface MyClass () { //注意此处:扩展
7. float value;
8. }
9. - (void)setValue:(float)newValue;
10. @end
11.
12. @implementation MyClass
13.
14. - (float)value {
15. return value;
16. }
17.
18. - (void)setValue:(float)newValue {
19. value = newValue;
20. }
21.
22. @end