iOS学习笔记06—Category和Extension

转载 2016年06月02日 09:53:03

一、概述

类别是一种为现有的类添加新方法的方式。

利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类)。

 

二、示例

1、声明类别

@interface NSString (CategoryDemo)

-(NSNumber*) lengthAsNumber;

@end

 

2、实现类别

@implementation NSString (CategoryDemo)

-(NSNumber*) lengthAsNumber{

   

    NSUInteger length = [self length];

    return ([NSNumbernumberWithUnsignedInt: length]);

}

@end

 

3、调用:

NSMutableDictionary *dic =[NSMutableDictionarydictionary];

[dicsetObject: [@"Hello"lengthAsNumber]forKey:@"hello"];

[dic setObject: [@"World!" lengthAsNumber] forKey: @"world"];

NSLog(@"%@", dic);

 

4、打印结果:

2012-07-27 17:43:32.993CategoryDemo[2193:f803] {

    hello = 5;

    world = 6;

}

 

三、类别的局限性

有两方面局限性:

(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。

(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

 

四、类别的作用

类别主要有3个作用:

(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。

(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告

(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。

 

 

四、扩展extension

下面是extension和category的语法示例:

// extension

@interface MyObject(){

    int iextension;

}

-(void)testInExtension;// 类的mainimplementation不实现的话,有编译警告。

@end

 

// category

@interface  MyObject(categoryDemo){

   

    //   int icategory;   // error: Ivarsmay not be placed in categories

}

-(void)testInCategory;// 不强制要求在类的mainimplementation中实现

@end

 

// implementation

@implementation MyObject

//

//-(void)testInExtension{

//

//}

//

//-(void)testInCategory{

//

//}

@end

他们的主要区别是:

1、形式上来看,extension是匿名的category

2extension里声明的方法需要在mainimplementation中实现,category不强制要求。

3extension可以添加属性(变量),category不可以。

iOS中 category 和extension的区别

原文链接:http://www.cnblogs.com/pengyingh/articles/2348514.html Category和Extension这两个概念,即便对于Java程序员,可...
  • wangshuchao0
  • wangshuchao0
  • 2015年02月04日 22:37
  • 1456

iOS学习笔记06—Category和Extension

iOS学习笔记06—Category和Extension   一、概述 类别是一种为现有的类添加新方法的方式。 利用Objective-C的动态运行时分配机制,Category...
  • leikezhu1981
  • leikezhu1981
  • 2014年02月11日 22:42
  • 26546

Object-C Category和Extension的区别

参考:http://stackoverflow.com/questions/3499704/difference-between-category-and-class-extension
  • yasi_xi
  • yasi_xi
  • 2014年11月14日 16:11
  • 6076

swift开发 创建Extension(即OC中的category)

swift开发 创建Extension(即OC中的category)
  • syg90178aw
  • syg90178aw
  • 2016年05月05日 14:16
  • 4759

【iOS学习笔记】Category和Extension

一、概述 类别是一种为现有的类添加新方法的方式。 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行...
  • u013883974
  • u013883974
  • 2015年08月07日 08:57
  • 303

OC中的类别Category-协议Protocol-扩展Extension

类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中。通常只在类别中定义方法。  类别,接口部分的定义,通常该文件命名为已有"类...
  • hanangellove
  • hanangellove
  • 2015年01月13日 23:11
  • 4184

【iOS】Xcode中如何新建Category、Empty File、Protocol、Extension

Xcode之前的版本,都是在 点击dock中Xcode(这里版本为4.3.3)应用, 上图中Welcome to Xcode 下有 Create...
  • u014395105
  • u014395105
  • 2014年10月25日 10:35
  • 1728

Objective-C中Extension与Category的使用

Objective-C 2.0增加了class extensions用于解决两个问题: 允许一个对象可以拥有一个私有的interface,且可由编译器验证。支持一个公有只读,私有可写的属性。 ...
  • HorkyChen
  • HorkyChen
  • 2012年09月18日 23:22
  • 11383

Category(类别)和扩展(Extension)的区别

类别: 1.类别不能为已存在的类添加实例变量。 2.类别中添加的方法优先级高,会覆盖原类中的方法 3.原类中的私有方法,可以在类别中定义一下,这样就可以使用了。 4.在categroy中定义的...
  • qq_27325349
  • qq_27325349
  • 2016年03月20日 12:01
  • 405

ios Category 和 extension 区别,Category中使用属性

苹果的官方文档 Category在iOS开发中使用非常频繁。尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性。 #...
  • zhouleizhao
  • zhouleizhao
  • 2014年07月08日 14:16
  • 994
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS学习笔记06—Category和Extension
举报原因:
原因补充:

(最多只允许输入30个字)