Objective-C分类 (category)和扩展(Extension)

1、分类(category)

使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到,这点和javascript中使用原型来定义属性有点类似。

我们可以为一个类创建一个新的方法,而不需要在代码中编辑类定义。

下面就是定义并使用分类的例子程序,通过下面代码,我们可以给Object-C中的NSString 添加camelCaseString分类,使用camelCaseString方法,就可以去掉一个字符串中的空格,并将原有空格后的单词改写成大写(即 将字符串转化为驼峰式)。

[cpp] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. /*
  3. 定义分类的过程大致可分为以下几个步骤:
  4. 第一步、创建一个带有接口的新文件,即创建已有类
  5. 第二步、在新文件中添加需要扩展的方法及方法的实现,即需要添加的分类
  6. */
  7. //NSString 表示将要添加分类的类名称,该类必须是已存在的。
  8. //CamelCase 是为类添加的方法名称。
  9. //只能添加方法,不能添加变量。
  10. //头文件命名惯例:ClassName+CategoryName.h
  11. @interface NSString (CamelCase)
  12. -(NSString*) camelCaseString;
  13. @end
  14. @implementation NSString (CamelCase)
  15. -(NSString*) camelCaseString
  16. {
  17. //调用NSString的内部方法获取驼峰字符串。
  18. //self指向被添加分类的类。
  19. NSString *castr = [self capitalizedString];
  20. //创建数组来过滤掉空格, 通过分隔符对字符进行组合。
  21. NSArray *array = [castr componentsSeparatedByCharactersInSet:
  22. [NSCharacterSet whitespaceCharacterSet]];
  23. //把数组的字符输出
  24. NSString *output = @"";
  25. for(NSString *word in array)
  26. {
  27. output = [output stringByAppendingString:word];
  28. }
  29. return output;
  30. }
  31. @end
  32. int main (int argc, const char * argv[])
  33. {
  34. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  35. NSString *str = @"My name is bill.";
  36. NSLog(@"%@", str);
  37. str = [str camelCaseString];
  38. NSLog(@"%@", str);
  39. [pool drain];
  40. return 0;
  41. }

2、扩展(Extension)

关于扩展,你可以这样理解:扩展是一种匿名分类;但是和匿名分类不一样的是,扩展可以添加新的实例变量(是不是觉得扩展已经强大到非一般的地步了? ^_^)

从Xcode 4 之后就推荐在自定义类的.m文件中使用扩展,这样就能保证良好的代码封装性,避免把私有接口暴露给外面。

下面是一个扩展的例子:

[plain] view plaincopy

    1. @interface MyClass : NSObject
    2. - (float)value;
    3. @end
    4. @interface MyClass () { //注意此处:扩展
    5. float value;
    6. }
    7. - (void)setValue:(float)newValue;
    8. @end
    9. @implementation MyClass
    10. - (float)value {
    11. return value;
    12. }
    13. - (void)setValue:(float)newValue {
    14. value = newValue;
    15. }
    16. @end
时间: 2024-08-01 10:41:58

Objective-C分类 (category)和扩展(Extension)的相关文章

iOS 使用分类category和扩展extension

在OC中可以对库里面的类在原有基础上进行扩展 比如对NSSting添加新的属性变量和方法,可以在xcode中新建对应的.m文件 选择对应的原有的类 然后可以选择扩展或者分类,分类会自动以+号连接,扩展会自动以_号连接,比如 "NSString+security.h" "NSString_extension.h" 扩展能够添加属性变量和方法,但只是新增一个头文件 分类可以添加方法,不能添加属性变量,有一个头文件和一个.m文件,m文件里面可以实现具体的方法 所以在分类里

iOS类别Category与扩展Extension

本文主要是详解iOS类别(Category)与扩展(Extension,匿名类别),请登陆疯狂软件教育官网.Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. [objc] view plaincopy在CODE上查看代码片派生到我的代码片 #import @interface NSObject (Category) - (void)myMethod; @end 这是一个

Arc 自动内存管理 分类Category 类扩展 Block 代码段 和 Protocol协议的一些简单知识的总结

1. Arc的使用 Arc是自动内存管理: arc的使用原则 1).只要对象没有任何强类型指针引用就会被释放’. 2).只要对象被任何强类型指针指引就不会被释放. 弱指针:__weak 被__weak修饰的指针就被称为弱型指针: 强类型指针 默认的指针都是强类型指针: 被__strong修饰的指针也是强类型指针. 使用Arc时可以重写dealloc方法,但是在重写方法时不能手动调用[super dealloc]: 在Arc中通过@property生成的属性如果是OC的对象那么要用Strong来修

iOS类别(Category)与扩展(Extension)-b

苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #import @interface NSObject (Category) - (void)myMethod; @end 这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法. 使用Category需要注意的点: (1) Category的方法不一定非要在@imp

iOS类别(Category)与扩展(Extension,匿名类别)

Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #import @interface NSObject (Category) - (void)myMethod; @end 这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法. 使用Category需要注意的点: (1) Category的方法不一定非要在@implementat

类目 (category),扩展(Extension)和协议(protocol) (转)

@类目-分类(category) 1.类目: 类目(也成类别:Category)是一种为现有类添加新方法的方式2.类目的局限性:1)类目无法向已有的类中添加实例变量: 2)如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,发生这种情况,则已有类的原始方法永无天日,最好的办法是将自己扩展的方法和原始方法区分开来. 3.类目的作用:?       将类的实现分散到多个不同的文件中–      将多个类目的声明放入同一个.h文件中–      将实现放入多个.m方法中?       使

Objective-C:分类(Category、extension)

分类(Category .Extension) (一)分类的划分 (2) 1.(命名的类别)类别Category:只能添加新的方法,不能添加新变量. 2.(未命名的类别)类的扩展Extension://扩展一般直接写在类的实现文件中     //扩展中定义的都是类中私有的实例变量和方法 (二)分类的使用 (1)分类只能增加方法(包括类方法和对象方法),不能增加成员变量 (2)在分类方法的实现中可以访问原来类中的成员变量: (3)分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的

Objective-C语法之扩展(Extension)的使用

Objective-C 2.0增加了Class Extension用于解决两个问题: 可声明私有可读写的属性,而在类的声明中是同名的公开只读属性,从而来支持公开只读.私有可读写的属性 可声明私有方法:允许一个对象可以拥有一个私有的@interface,且可由编译器验证 公开只读.私有可写的属性(Publicly-Readable, Privately-Writeable Properties) 实现一个不可变(immutable)的数据结构通常有一个好处是外部代码不能用setter方法修改对象的

31-oc分类和类扩展

分类基本概念 书写Category的格式 // 分类的声明 @interface ClassName (CategoryName) NewMethod; //在类别中添加方法 //不允许在类别中添加变量 @end ClassName: 需要给哪个类扩充方法 CategoryName: 分类的名称 NewMethod: 扩充的方法 // 分类的实现 @implementation ClassName(CategoryName) NewMethod ... ... @end ClassName: 需