Objective-C 日记⑨ 类别Category
类别(Category)['kætiɡəri] n. 种类,分类;范畴
定义:为现有的类添加新方法
一、声明类别
类别的声明与类的声明格式相似,如下:
@interfaceNSString (NumberConvenience)//convenience [kən'vi:njəns]n. 便利;厕所;便利的事物-(NSNumber *) lengthAsNumber; @end
该声明具有如下特点:
1、现有的类位于@interface关键字之后,该方法表示向NSString类中添加一个名称NumberConvenience的类别。(注意:要保证类别名称的唯一性)
2、可以添加其他类别的类(本例中是NSString你也可以添加其他类)和方法。别问了以@end结束。
与类的区别:类别中不可以声明实例变量
二、实现类别
@implementation NSString (NumberConvenience) -(NSNumber *) lengthAsNumber { unsigned int length =[self length]; return ([NSNumber numberWithUnsignedInt:length]); } @end
说明:lengthAsNumber方法通过[self length]来获得字符串长度。
eg:
创建一个新的NSMutableDictionary类的对象并添加一个字符串及其长度,分别做键和值。
int main(int argc,const char *argv[]) { NSAutoreleasePool *pool; pool=[[NSAutoreleasepool alloc] init]; NSMutableDictionary *dict; dict =[NSMutableDictionary dictionary]; [dict setObject:[@"hello" lengthAdNumber] forKey:@"hello"]; NSLog(@"%@",dict); [pool release]; return (0); }
暂无mac 运行结果(不出bug)为5
三、局限性及作用
局限性:
1、无法向类中添加新的实例变量;
2、命名容易起冲突,简单的说就是类别中的方法名和现有的方法名重名;当冲突时你的类别方法将取代初始方法(类别的优先级高)
作用:
1、将类的实现分散到多个不同的文件或多个不同框架中
2、创建对私有方法的前向引用 前向引用声明不能声明该类的对象, 也不能在内联成员函数中使用该类的对象, 只能声明该类的指针, 引用, 函数形参和返回类型
3、向对象添加非正式协议
注:非正式协议(interface) oc中的协议跟c#中的接口(interface)区别:c#中接口是强制必须实现的,否则编译报错,而obj-c虽然在编译时会警告,但是最终能编译通过。
正式协议(protocal):语义上更强烈一些:要求采用该协议的类,"必须"实现协议中约定的方法
作者:PEPE
出处:http://pepe.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述