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. NSString *output = @"";
  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. NSString *str = @"My name is bill.";
  49. NSLog(@"%@", str);
  50. str = [str camelCaseString];
  51. NSLog(@"%@", str);
  52.  
  53. [pool drain];
  54. return 0;
  55. }

  

2、扩展(Extension)

你可以这样理解:扩展就是匿名分类,下面是一个扩展的例子:

  1. @interface MyClass : NSObject
  2. - (float)value;
  3. @end
  4.  
  5. @interface MyClass () { //注意此处:扩展
  6. float value;
  7. }
  8. - (void)setValue:(float)newValue;
  9. @end
  10.  
  11. @implementation MyClass
  12.  
  13. - (float)value {
  14. return value;
  15. }
  16.  
  17. - (void)setValue:(float)newValue {
  18. value = newValue;
  19. }
  20.  
  21. @end

  

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

  1. iOS类别(Category)和扩展(Extension,匿名类)

    Category在iOS在开发常用. 特别是对于系统扩展上课时间.我们不能继承系统类.直接添加到系统类方法,最大程度上体现Objective-C动态语言特征. #import @interface N ...

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

    苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #im ...

  3. OC中分类(Category)和扩展(Extension)

    1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...

  4. iOS分类(category),类扩展(extension)—史上最全攻略

    背景: 在大型项目,企业级开发中多人同时维护同一个类,此时程序员A因为某项需求只想给当前类currentClass添加一个方法newMethod,那该怎么办呢? 最简单粗暴的方式是把newMethod ...

  5. 类目(category) - 类扩展(extension) 区别

    说明: 方法,属性或变量:   类别只能添加方法,不能添加属性(理论上,但可以通过runtime的关联添加). 扩展可以添加方法和实例变量或属性,实例变量默认@private类型.扩展是类别的一个特例 ...

  6. 类别(Category)与扩展(Extensions)

    一.类别(Category) 类别(Category)是一种可以为现有的类(包括类簇:NSString...,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类.类别添加的新方法可以被子类继 ...

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

    1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...

  8. iOS中 分类(category)与扩展(Extension)的区别?

    1.分类(category)的作用 (1).作用:可以在不修改原来类的基础上,为一个类扩展方法.(2).最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? (1).分类中只能添加“方法”,不 ...

  9. Objective-C分类 (category)和扩展(Extension) 的区别

    http://blog.csdn.net/yhawaii/article/details/6992094 http://blog.163.com/wangy_0223/blog/static/4501 ...

随机推荐

  1. 第八章 对称加密算法--AES

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 8.1.AES 特点: 密钥建立时间短.灵敏性好.内存需求低(不管怎样,反正就是好) ...

  2. v-bind绑定属性样式

    一.class的四种绑定方式 1.布尔值的绑定方式 <div id="demo"> <span v-bind:class="{'class-a':isA ...

  3. Node.js中package.json中^和~的区别

    webpack 项目的package.json 文件列出了项目所依赖的插件和库,同时也给出了对应的版本说明,但是在版本说明前面还有个符号:'^'(插入符号)和'~'(波浪符号),总结了下他们之间的区别 ...

  4. WM_COPYDATA

    1. WM_COPYDATA : https://msdn.microsoft.com/en-us/library/windows/desktop/ms649011(v=vs.85).aspx COP ...

  5. 使用innerHTML时要注意的一点

    为某个元素添加内容时,使用的是document.getElementsByClassName,由于只有一个元素拥有这样的ClassName,就直接这样用,document.getElementsByC ...

  6. AtomicLong与LongAdder的区别

    AtomicLong的原理 AtomicLong是通过依靠底层的CAS来保障原子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目的. LongAdder的 ...

  7. Paket介绍

    在国外.NET社区有一个很火的话题是Packet(https://fsprojects.github.io/Paket/index.html ),它本质上是Nuget 之外的另一种方式管理.NET项目 ...

  8. C#中的约束类型

  9. TimeZone 时区 (JS .NET JSON MYSQL) + work week 闰年

    来源参考 : http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html 来源参考 : http://walkingice.blogs ...

  10. Rspec: feature spec 功能测试 测试JavaScript.

    我们要把应用各组件放在一起做集成 测试,这样才能保证模型和控制器之间能够良好契合. 在 RSpec 中,这种测试称为功能测试(feature spec),有时也称为验收测试(acceptance te ...