您的位置:首页 > 移动开发 > Objective-C

Objective-C 日记⑨ 类别Category

2012-09-12 13:35 417 查看
类别(Category)['kætiɡəri] n. 种类,分类;范畴
  定义:为现有的类添加新方法

一、声明类别

类别的声明与类的声明格式相似,如下:

@interfaceNSString (NumberConvenience)//convenience [kən'vi:njəns]n. 便利;厕所;便利的事物-(NSNumber *) lengthAsNumber;
@end


  该声明具有如下特点:

    1、现有的类位于@interface关键字之后,该方法表示向NSString类中添加一个名称NumberConvenience的类别。(注意:要保证类别名称的唯一性)

    2、可以添加其他类别的类(本例中是NSString你也可以添加其他类)和方法。别问了以@end结束。

  与类的区别:类别中不可以声明实例变量

二、实现类别

@implementation NSString (NumberConvenience)
-(NSNumber *) lengthAsNumber
{
unsigned int length =[self length];
return ([NSNumber numberWithUnsignedInt:length]);
}
@end


说明:lengthAsNumber方法通过[self length]来获得字符串长度。

eg:

  创建一个新的NSMutableDictionary类的对象并添加一个字符串及其长度,分别做键和值。

int main(int argc,const char *argv[])
{
NSAutoreleasePool *pool;
pool=[[NSAutoreleasepool alloc] init];
NSMutableDictionary *dict;
dict =[NSMutableDictionary dictionary];
[dict setObject:[@"hello" lengthAdNumber] forKey:@"hello"];
NSLog(@"%@",dict);
[pool release];
return (0);
}


  暂无mac 运行结果(不出bug)为5

三、局限性及作用

局限性:

  1、无法向类中添加新的实例变量;

  2、命名容易起冲突,简单的说就是类别中的方法名和现有的方法名重名;当冲突时你的类别方法将取代初始方法(类别的优先级高)

作用:

  1、将类的实现分散到多个不同的文件或多个不同框架中

  2、创建对私有方法的前向引用 前向引用声明不能声明该类的对象, 也不能在内联成员函数中使用该类的对象, 只能声明该类的指针, 引用, 函数形参和返回类型

  3、向对象添加非正式协议

    注:非正式协议(interface) oc中的协议跟c#中的接口(interface)区别:c#中接口是强制必须实现的,否则编译报错,而obj-c虽然在编译时会警告,但是最终能编译通过。

      正式协议(protocal):语义上更强烈一些:要求采用该协议的类,"必须"实现协议中约定的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: