1、问题
你想要给一个类添加方法和行为,但你不想从头创建一个全新的子类。
2、解决方案
在Objective-C中,你可以用categories来定义和实现properties和methods,之后它们可以被附到一个类上。要完成这件事,你需要有2个文件:一个头文件列出接口、一个实现文件列出实现。当category搞好了,就可以导入该category头文件;任何将该category赋予其之上的类将会拥有这些properties和methods。
4、原理
你需要的第1个东西就是头文件。就说,你要扩展NSString类,加一些方法帮助你创建HTML文本。
下面是一个category头文件,里面有一个接口,代码如下:
@interface NSString (HTMLTags)
上面的NSString就是你要扩展的类。这意味着该category可能只会被运用到NSString(或NSString的子类)。在类名后面圆括号中的是给category的名字。
该category的properties和methods都要放在interface的后面,@end的前面。
实现:
@implementation NSString (HTMLTags)
5、代码
Listing 1-13. HTMLTags.h
#import <Foundation/Foundation.h>
@interface NSString (HTMLTags)
-(NSString *) encloseWithParagraphTags;
@end
==========================================
Listing 1-14. HTMLTags.m
#import "HTMLTags.h"
@implementation NSString (HTMLTags)
-(NSString *) encloseWithParagraphTags{
return [NSString stringWithFormat:@"<p>%@</p>",self];
}
@end
===========================================
Listing 1-15. main.m
#import "HTMLTags.h"
int main (int argc, const char * argv[]){
@autoreleasepool {
NSString *webText = @"This is the first line of my blog post";
//Print out the string like normal:
NSLog(@"%@", webText);
//Print out the string using the category function:
NSLog(@"%@", [webText encloseWithParagraphTags]);
}
return 0;
}
6、使用
Categories通常用在这些情形下:你想避免创建一个复杂的继承层次。Categories also help your code remain readable.例如,你想要在项目中用一个category来扩展NSString,你的大多数代码对于使用过NSString的其他人来说都是熟悉的。假如写一个NSString的子类,例如NSHTMLString,就可能会导致困惑。
相关推荐
总的来说,ASP源码—瓜果蔬菜批发网 v1.8.zip是一个涉及ASP编程、数据库管理、用户体验设计等多个IT领域的项目,它为搭建一个完整的线上批发平台提供了基础框架和功能模块。开发者或网站所有者可以根据自己的需求对...
总的来说,易企yiqicms1.8/phpCMS/php伪静态企业网站程序是一个全面且功能强大的内容管理系统,它的伪静态特性有助于SEO,丰富的功能模块满足了企业网站的各种需求,无论是内容发布、产品展示还是用户互动,都能得到...
本文档是一个快速参考,主要覆盖MediaWiki 1.19版本及其扩展,包括Parser Functions 1.4、Semantic MediaWiki 1.8、Semantic Result Formats 1.8、Semantic Maps 2.0、Semantic Internal Objects 0.6、Semantic ...
支持多任务同时下载,支持设置文件下载优先级,可以根据计划任务调整占用的带宽,全局/单个任务的速度限制,快速断点续传机制,支持 UPnP 和 NAT-PMP,支持流行的 BT 扩展协议,支持用户来源交换,支持 DHT 网络,...
- **Bundle-Activator**: 指定一个特定的类作为激活器(Activator),当Bundle被激活时,该类会被框架调用以初始化Bundle。例如: ``` Bundle-Activator: org.riawork.demo.Activator ``` - **Bundle-Category**:...
Testopia作为Bugzilla的一个扩展组件,主要用于跟踪产品测试的过程和结果。它不仅支持传统的Bug追踪,还提供了更为全面的测试管理功能。 **2.2 Testopia的核心概念** - **TestPlans**:测试计划是最顶层的概念,...
该项目旨在通过JavaWeb技术构建一个高效且易于使用的图书管理系统。系统的目标是利用计算机自动处理图书馆中的各种信息,包括图书资料、用户借阅记录等,以此提升图书馆的管理效率和服务质量。 #### 二、系统功能...
- **引脚35**:在SIM7600C中,该引脚被定义为`HSIC_STROBE(保留)`,而在SIM7100C中则被用作一个通用输入输出(GPIO)。 - **引脚36**:同样地,在SIM7600C中,该引脚被标记为`HSIC_DATA(保留)`,但在SIM7100C中也被...
它使用事件观察器来使其工作。 技术支持 我在magento 1.8版中测试了此功能。 但很可能它将与其他版本一起使用 安装 下载此zip文件。 解压缩。 将其粘贴到您的Magento应用程序目录。 大功告成 理论 您是否想知道此...
后台管理界面上可能会出现提示信息,如“未授权”等,可以通过编辑后台管理界面的相关文件(如`admin/index.php`)来移除这类提示。 ##### 1.6 发布站内新闻 发布站内新闻有助于提升用户的参与度。在ECShop后台,...
2.1.1 设计一个简单的空间配置器,jj::allocator 044 2.2 具备次配置力(sub-allocation)的sgi 空间配置器 047 2.2.1 sgi 标准的空间配置器,std::allocator 047 2.2.2 sgi 特殊的空间配置器,std::alloc 049 ...
2.1.1 设计一个简单的空间配置器,JJ::allocator 044 2.2 具备次配置力(sub-allocation)的SGI 空间配置器 047 2.2.1 SGI 标准的空间配置器,std::allocator 047 2.2.2 SGI 特殊的空间配置器,std::alloc 049 ...