1、分类(category)

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

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

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

  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文件中使用扩展,这样就能保证良好的代码封装性,避免把私有接口暴露给外面。

下面是一个扩展的例子:

    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

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

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

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

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

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

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

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

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

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

  5. Objective-C 类别(category)和扩展(Extension)

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

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

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

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

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

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

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

  9. 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别

    1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...

随机推荐

  1. hdu 5724 Chess 博弈

    题目链接 一个n行20列的棋盘. 每一行有若干个棋子. 两人轮流操作, 每人每次可以将一个棋子向右移动一个位置, 如果它右边有一个棋子, 就跳过这个棋子, 如果有若干个棋子, 就将这若干个都跳过. 但 ...

  2. 【Chromium中文文档】多进程资源加载

    多进程资源加载(需要更新) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture ...

  3. JAVA之Exchanger

    如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到Exchanger这个类,Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只 ...

  4. EF简介

    EF:EF是 asp.net的一套ORM框架. ORM: 广义上:ORM指的是面向对象的模型和关系型数据库的数据库之间的相互转换; 狭义上:ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟 ...

  5. gulp使用心得

    本文假设你之前没有用过任何任务脚本(task runner)和命令行工具,一步步教你上手Gulp.不要怕,它其实很简单,我会分为五步向你介绍gulp并帮助你完成一些惊人的事情.那就直接开始吧. 第一步 ...

  6. Win32下C++遍历目录和文件的源码

    #include<windows.h> #include<iostream> #include<string> using namespace std; //只能处 ...

  7. VlanTrunk

    简单的vlan trunk的配置: 第一步:添加vlan 1 Switch>enable 2 Switch#show vlan VLAN Name Status Ports ---- ----- ...

  8. Tomcat使用startup启动,一闪而过,如何查看出错信息

    解决办法:打开startup.bat,通过使用run命令在原有启动窗口显示出错信息. 在startup.bat中找到:call "%EXECUTABLE%" start %CMD_ ...

  9. Css元素布局定位

    <!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  10. spring mvc 简单搭建

    文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下. web.xml配置: </load-on-startup>     </servlet>    ...