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

Category概述 Category是一种为现有的类添加新方法的方式,利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对c...

黑马程序员----OC学习笔记之category,extension,protocol

协议、类目

iOS学习笔记06—Nsstring常见用法

//1、创建常量字符串。 NSString *astring = @"This is a String!";   //2、创建空字符串,给予赋值。 NSSt...
  • jr773
  • jr773
  • 2013年08月08日 16:33
  • 501

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

本文会带你看懂分类,类扩展和匿名分类的前世今生,从看懂到会用。

IOS 学习笔记13 Category的使用

无论一个类设计的如何完美,都不可避免的会遇到没有预测到的需求,那怎么扩展现有的类呢?当然,继承是个不错的选择。但是Objective-C提供了一种特别的方式来扩展类,叫Catagory,可以动态的为已...

编译原理学习笔记06——(连连看—准备一下很多课件都演示的公式E → E+T | T )——2014_1_22

看了很多课件(至少3种),居然都用到了下面的例子, G:   E → E+T | T   T → T*F | F   F → (E) | i 而且复杂的分析也是围绕上式展开的...

学习笔记06—注解(Annotation)

android培训 java培训期待与您交流! 面向对象的封装可以把现实对象的属性封装到对象内部。 个人感觉这样的方式并不能有效的抽象现实。有些对象的属性是易于变换的,并不总是固定在对象内部...
  • i10mg
  • i10mg
  • 2013年04月12日 16:48
  • 407

编译原理学习笔记08——(没有国你什么都不是之FOLLOW ME—推导笔记06的FOWLOW集)——2014_1_24

好像中了教科书的套了,越来越循规蹈矩了。

ios学习笔记-06-实践

06-实践2015.7.15上午 1,自定义UIView 2,xib:图形化自定义view 什么是xib:xib也是布局界面的描述工具 相比storyboard,xib是轻量级的 指定xib的cus...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS学习笔记06—Category和Extension
举报原因:
原因补充:

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