文档章节

iOS学习笔记06—Category和Extension

H
 HillYoung
发布于 2014/10/08 17:34
字数 608
阅读 86
收藏 0

一、概述

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

利用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不可以。


本文转载自:http://blog.csdn.net/leikezhu1981/article/details/19091049

共有 人打赏支持
H
粉丝 13
博文 96
码字总数 25777
作品 0
南京
程序员
私信 提问
10个优秀Objective-C和iOS开发在线视频教程

如果你自己开发iOS应用,你肯定会发现网上有很多资源。学习编程的一个最好的方法就是自己写代码,而开始写代码的最快的方式就是看其他人怎么写。我们从海量视频和学习网站中整理出了我们认为...

mingxun
2014/05/09
0
0
Core Data 学习笔记 常用链接整理

目录 Core Data 学习笔记(一)框架简介 Core Data 学习笔记(二)被管理对象模型 Core Data 学习笔记(三)被管理对象 Core Data 学习笔记 应用示例 Core Data 学习笔记 常用链接整理 文章 ...

灰大羊
2015/07/31
0
0
iOS Push详述,了解一下?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由WeTest质量开放平台团队发表于云+社区专栏 作者:陈裕发, 腾讯系统测试工程师 商业转载请联系腾讯WeTest获得授权,非商业...

腾讯云加社区
10/26
0
0
xcode5-ios7-如何添加120×120图标(ios7图标命名)

Xcode5发布需要的新的程序图标 Icon.png 57X57 10px 用户AppStore以及iPhone/iPod 中显示 必需 Icon@2x.png 114X114 20px 高清模式 Icon120.png 120X120 20px 用于iPhone5的高清显示 Icon-S...

lingfeng72
2015/06/23
0
0
IOS学习,最简单的表格应用程序,学习,列出博客

IOS编程浅蓝教程,这是博客地址http://www.cnblogs.com/haichao/category/425378.html IOS编程浅蓝教程:锲子 IOS编程浅蓝教程(一)先决条件:开始iOS编程的必要准备 IOS编程浅蓝教程(二) Hel...

andy521zhu
2015/01/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

域名备案图文教程

摘要: 备案不易,且行且珍惜! 我买了个腾讯云的服务器,1核1G,打算用于部署个人网站kiwenlau.com。根据规定,在国内部署网站,是需要为域名备案的... 备案是通过腾讯云申请的,一切都很顺利...

Fundebug
8分钟前
0
0
怎么写出好的敏捷测试(Agile Tesing)策略文档

敏捷测试策略 在敏捷环境中,我们在短期冲刺或迭代中工作,每个sprint只关注一些需求或用户故事,因此文档在数量和内容方面可能不会那么广泛。 之前我们得出的结论是,由于时间限制,我们可能...

程序猿拿Q
9分钟前
0
0
Linux之《荒岛余生》(二)CPU篇

Linux之《荒岛余生》(二)CPU篇 温馨提示,动图已压缩,流量党放心查看。CPU方面内容不多,我们顺便学点命令。本篇是《荒岛余生》系列第二篇,垂直观测CPU。其余参见: Linux之《荒岛余生》...

小姐姐味道
13分钟前
0
0
DRDS SQL 审计与分析——全面洞察 SQL 之利器

背景 数据库存储着系统的核心数据,其安全方面的问题在传统环境中已经成为泄漏和被篡改的重要根源。而在云端,数据库所面临的威胁被进一步的放大。因此,对云数据库的操作行为尤其是全量 SQ...

阿里云云栖社区
14分钟前
2
0
JSONArray 排序

List<JSONObject> jsonArySort = new ArrayList<JSONObject>();    for (int i = 0; i < rtJsonArray.length(); i++) {    jsonArySort.add(rtJsonArray.getJSONObject(i));......

MoksMo
16分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部