一 、类目: 为已存在的类添加新的方法。但是不能添加实例变量。
应用:1、对现有的类进行扩展,如:系统中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别。
2、作为子类的替代方式,不需要定义和使用一个子类,可以通过类目直接向已有的类里增加方法。
3、对类中的方法进行归类,利用catigory把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。
4、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
局限性: 1、无法向类目中添加新的实例变量。
2、类目中的方法具有更高的优先级,若在类目中覆盖原始类的方法(重载)。会引起super消息的无效,因此,一般不要覆盖现有类中的方法。
如果确实要重载,那就通过继承创建子类来实现。
命名方式:类名+扩展方法,如“UIAlertView+AFNetworking”。类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用 途。
在AFNetworking中有这样一个类目、实现附带alterview 的网络请求。
例:UIAlertView+AFNetworking.h文件中
<span style="font-family:System;font-size:12px;">#import <Foundation/Foundation.h> @interface UIAlertView (AFNetworking) + (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task delegate:(id)delegate;</span>UIAlertView+AFNetworking.m文件中
<span style="font-family:System;font-size:12px;">#import "UIAlertView+AFNetworking.h" @implementation UIAlertView (AFNetworking) + (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task delegate:(id)delegate { [self showAlertViewForTaskWithErrorOnCompletion:task delegate:delegate cancelButtonTitle:NSLocalizedStringFromTable(@"Dismiss", @"AFNetworking", @"UIAlertView Cancel Button Title") otherButtonTitles:nil, nil]; }</span><span style="font-size:12px;font-family: 宋体, 'Arial Narrow', arial, serif;"> </span>
二、延展:延展的作用就是定义自己的私有方法。
形式和类目相同,不用新创建文件,延展中定义的方法在类本身的@implementation代码区域中进行实现。
当在定义延展的时候不提供类目名时,延展中定义的方法既被视为“必须实现”的API在这种情况下,如果方法没有实现代码,那么编译器会报警告,这个时候方法的实现就一定要出现在类主体的@implementation代码块中了。
原文地址:http://blog.csdn.net/mrliuzhe/article/details/41802745