Objective-C中的类别(Category)的使用
Objective-C中的类别(Category)主要有两大功能,一个是将类的相关方法进行分组,另一个是无需继承即可向现有的类添加新的方法以扩展其功能。
例如,您所在的开发团队需要创建一个类,每个团队成员负责类的某一部分功能,例如成员A负责编写对象的创建与释放的方法、成员B负责编写网络通信的方法、成员C负责数据的家在与保存方法等。iOS SDK中大量使用了类别,这里以NSArray类的外部接口声明为例(代码中以...省略了其他方法的接口声明):
@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>
- (NSUInteger)count;
- (id)objectAtIndex:(NSUInteger)index;
@end@interface NSArray (NSExtendedArray)
- (NSArray *)arrayByAddingObject:(id)anObject;
- (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray;
- (NSString *)componentsJoinedByString:(NSString *)separator;
...
@end@interface NSArray (NSArrayCreation)
+ (id)array;
+ (id)arrayWithObject:(id)anObject;
...
@end@interface NSArray (NSDeprecated)
- (void)getObjects:(id __unsafe_unretained [])objects;
@end
注意类别的名字在小括号中,并且位于源类名之后。例如NSExtendedArray是类别名称,它扩展了NSArray类。
类别方法的实现格式如下:
@implementation NSArray (NSArrayCreation)
+ (id)array
{...
}
...
@end
类别的实现部分可以放在类的实现文件中,也可以放在额外的实现文件中。
以上介绍的是有名的类别,有名的类别中只能添加静态方法或者实例方法,不能添加成员变量、属性。类别还有一种特殊的使用方式是创建无名的类别(也叫类的扩展),即括号内为空,例如(TestObject是一个类):
@interface TestObject ()
@property int extensionValue;
-(void)setExtensionName:(NSString*)name;
@end
注意到无名类别除了可以添加方法之外,还允许向类添加额外的成员变量和属性,它们的实现需要放在类的实现部分中。例如:
@implementation TestObject
@synthesize value = _value; //实现在类的外部接口中声明的value属性
@synthesize extensionValue = _extensionValue; //实现在无名类别中声明的extensionValue属性-(void)setExtensionName:(NSString*)name
{NSLog(@"%d, %@", _extensionValue, name);
}
...
//实现其他类的方法
...
@end
注意无名类别中添加的方法,其访问级别为私有(@private),你可以在其中添加类的内部私有方法和成员。
#import "TestClass.h"int main(int argc, const char * argv[])
{@autoreleasepool{ TestClass* tc1 = [[[TestClass alloc] init] autorelease];tc1.extensionValue = 2; //编译错误,私有成员无法访问}return 0;
}
以上代码无法通过编译,原因是在类扩展中定义的成员均为私有。
另外需要注意的是,类别的数量不受限制,一个类可以有很多的类别。类别中定义的方法的优先级高于类中定义的方法,也就是说当你在类别中定义了一个与源类中的签名完全一致的方法时,类别中的方法会完全覆盖源类中的方法,你无法调用源类中的方法。
Objective-C中的类别(Category)的使用相关推荐
- Objective C 类别(Category)与类扩展(Extensions)
一.类别(Category) 类别(Category)是一种可以为现有的类(包括类簇:NSString...,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类.类别添加的新方法可以被子类继 ...
- iOS进阶之类别(Category)(9)
类别使用场景 见解一 Category的主要作用是为已经存在的类添加方法. Objective-C 中的 Category 就是对装饰模式的一种具体实现.它的主要作用是在不改变原有类的前提下,动态地给 ...
- OC中protocol、category和继承的区别
利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"(OCP)的办法,也是最常见的一种方法.Objective C还支持另外两种语法来支持OCP:Protocol和Catego ...
- iOS中分类(category)和类扩展(Extension)的区别
iOS中分类(category)和类扩展(Extension)的区别 一.分类的定义: 分类是OC中的特有语法,它是表示一个指向分类结构体的指针,它是为了扩展系统类的方法而产生的一种方式. 二.分类的 ...
- 也说类别Category
转载请注明出处,谢谢.http://blog.csdn.net/cloosen/article/category/1191708 该文章会不定时更新,因为毕竟一次把他写全有点难,有的东西忘了写了什么的 ...
- 类别(Category)的作用(三)---添加非正式协议
在上一篇文章 类别(Category)的作用(二)中,详细说明类别的第二个作用,接下来是类别的第三个作用. 类别作用三:向对象添加非正式协议. 一.概念 显然这个名词是相对于正式协议而言的.什么是正式 ...
- wordpress模板_如何在WordPress中创建类别模板
wordpress模板 Have you visited a site where each category has different layout? In WordPress theme dev ...
- ICLR 2020 | 如何解决图像分类中的类别不均衡问题?不妨试试分开学习表征和分类器...
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:机器之心 在图像分类任务中类别不均衡问题一直是个难点,在 ...
- ML之FE:对pandas的dataframe中的类别型字段进行数字编码化(类别型特征数值化)并导出映射表daiding
ML之FE:对pandas的dataframe中的类别型字段进行数字编码化(类别型特征数值化)并导出映射表daiding 目录 对pandas的dataframe中的类别型字段进行数字编码化(类别型特 ...
最新文章
- mysql注入反弹_Discuz!x xss反弹后台无防御sql注入getshell(附带exploit)
- Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)
- 电脑网络维护_电脑维护小技巧(全面)
- js 日期天数相加减,格式化yyyy-MM-dd
- 训练神经网络时如何确定batch的大小?
- Socket开发框架之框架设计及分析
- SecureCRT连接虚拟机中的Linux系统
- [数论][NOIP]解方程
- 2021-08-23
- 计算机辅助初中英语教学,利用多媒体优化初中英语课堂教学课题研究
- 《ZLToolKit源码学习笔记》(16)网络模块之整体框架概述
- 【链世纪对话系列No.9】浪潮存储资深架构师叶毓睿:浪潮如何助力分布式云存储数据中心快速发展?
- 【python】django实现扫码签到
- .NET Framework各个版本(1.0 - 2.0)
- TCP为什么连接建立需要三次握手,而不是两次握手?
- Python基础灬文件常用操作
- python的书哪个好知乎_python书籍推荐 知乎红色有哪些
- openstack(pike) dvr 中南北数据流向分析
- C#ActiveX插件制作
- Android 消息推送OnePush