Category和Extension
转: http://blog.csdn.net/leikezhu1981/article/details/19091049
一、概述
类别是一种为现有的类添加新方法的方式。
利用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。
2、extension里声明的方法需要在mainimplementation中实现,category不强制要求。
3、extension可以添加属性(变量),category不可以。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2013-06-19 mac 下 outlook 邮箱 服务器端口设置
2013-06-19 转: "SMTP 服务器无法识别在 Mac 2011 Outlook 中发送电子邮件时错误。错误 17092"
2013-06-19 如果此处不对数据库进行关闭,将无法完成下一步的数据插入操作!
2013-06-19 UITextView 详解