类目是Object-C中最有用的一个特性。实质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节。

  这是特别有用的,因为你可以给一个内建的对象添加方法。当你想在你的应用程序里面给所有NSString类型的实例添加一个方法,你只需要添加一个类目,而不需要通过定义一个子类来添加该方法。

  比如,我想给NSString添加一个方法以判断它是不是一个URL,写法就像这样:

  #import<Cocoa/Cocoa.h>

  @interface NSString (Utilities)

  - (BOOL) isURL;

  @end

  这很像一个类的声明。不同的地方在于后面没有列出父类,并且在括号里面写了类目的名称。类目的名字可以随便取,但是最好能表达出你在类目中包含的方法所要做的事。

  下面是一个实现。切记,这不是很好的检查URL的方法。我们只是为了说清楚类目的概念。

  #import "NSString-Utilities.h"

  @implementation NSString (Utilities)

  - (BOOL) isURL

  {

    if([self hasPrefix:@"http://"]) //字符串前面是否为该字符串

    {

      return YES;

    }

    else{

      return NO;

    }

  }

  @end

  现在,你可以使用NSString 的这个方法了,下面的代码会在控制台打印“string1 is a URL”;

  NSString *string1 = @"http://www.baidu.com";

  NSString *string2 = @"baidu";

  if ([string1 isURL])

  {

    NSLog(@"string1 is a URL");

  }

  if ([string2 isURL])

  {

    NSLog(@"string2 is a URL");

  }

  与子类不同,你不能通过类目来添加实例变量。但是你能通过类目重写(override)类中已经存在的方法,当然,重写的时候要特别小心。

  记住,当你通过类目更改一个类的时候,这个更改会影响你这个应用程序中所有这个类的实例。

Object-C类目(Category)的更多相关文章

  1. objective-c 类目(Category)和延展(Extension)

    类目的基本概念: 如果有封装好的一个类,随着程序功能的增加,需要在类中增加一个方法,那我们就不必在那个类中做修改或者再定义一个子类,只需要在用到那个方法时添加一个该类的类目即可. 1.在类目定义的方法 ...

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

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

  3. Objective-C中的类目(Category),延展(Extension)

    类目和延展的作用都是为了扩展一个类. Objective-C中的类目(Category) 一.类目的定义和作用 类目也叫分类,英文Category,在没有原类.m文件的基础上,给该类添加方法. 比如, ...

  4. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  5. OC中协议, 类目, 时间, 延展, 属性

    只有继承和协议需要引IMPORT "头文件"; 必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @pr ...

  6. Objective - C - 添加类目 - NSDate

    1.类目为系统内部的类或者是没有源代码的类添加方法,不有添加实例变量 2.添加的方法会成为原类的一部分,子类照样可以使用 3.类目的文件名为原类名+文件名 4.既可以添加实例方法,也可以添加类方法 X ...

  7. iOS -类目,延展,协议

    1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...

  8. OC 中 类目、延展和协议

    Category : 也叫分类,类目. *是 为没有源代码的类 扩充功能 *扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承 *该方法只能扩充方法,不能扩充实例变量 ...

  9. Runtime学习与使用(一):为UITextField添加类目实现被键盘遮住后视图上移,点击空白回收键盘

    OC中类目无法直接添加属性,可以通过runtime实现在类目中添加属性. 在学习的过程中,试着为UITextField添加了一个类目,实现了当TextField被键盘遮住时视图上移的功能,顺便也添加了 ...

随机推荐

  1. 图解SVD分解

    参考 http://www.bfcat.com/index.php/2012/03/svd-tutorial/

  2. 关于 UGUI 字体花屏或乱码。

    我们项目从某个时候开始ui突然开始出现字体花屏现象(unity 开发版本:5.3.6p6),而且很难必现却又时有发生,确实查找和解决起来不太容易. 关于这个问题,uwa官方给出了解释,http://b ...

  3. bzoj 1228 [SDOI2009]E&D(sg函数,找规律)

    Description 小E 与小W 进行一项名为“E&D”游戏.游戏的规则如下:桌子上有2n 堆石子,编号为1..2n.其中,为了方便起见,我们将第2k-1 堆与第2k 堆(1 ≤ k ≤ ...

  4. Storm系列(二十)分区事务PartitionTransaction及示例

    在Storm中分区事务的处理,Spout端需要实现IPartitionedTransactionalSpout接口,用于对批次及偏移量的控制,而Bolt都必须实现IBatchBolt接口,通常继承至B ...

  5. Mac中下载JDK手动更新出现“只支持10.7.3以上的系统版本”问题解决方案

    今天倒腾Hadoop,要修改源码,由于之前搞研究是基于hadoop1.0.3来做的,所以这次也用的这个版本,但是我电脑上Java的版本是1.8以上的,结果用ant编译hadoop源码报错,错误大概是这 ...

  6. iOS设备的硬件适配 (关于armv6, armv7, armv7s ) <转>

    <转> http://blog.csdn.net/smking/article/details/8148702 1.OpenGL ES版本支持   iPhone:iPhone 3G以下(包 ...

  7. 问题-[Delphi]提示Can't load package:dclite70.bpl解决方法

    问题现象:提示Can't load package:dclite70.bpl 问题原因:全是Window2003的Data Execution Prevention(DEF数据执行保护)造成的. 解决 ...

  8. A Tour of Go Slices

    A slice points to an array of values and also includes a length. []T is a slice with elements of typ ...

  9. android图片闪烁或帧动画

    remote_recording_transition.xml 文件 <?xml version="1.0" encoding="utf-8"?> ...

  10. Atom实例

    示例[编辑] 一个Atom文档: <?xml version="1.0" encoding="utf-8"?> <feed xmlns=&qu ...