类别(category)

类别(category)

  • 类别:类别是一种为现有的类添加新方法的方式。使用类别你可以为任何类添加新的方法,包括那些没有源代码的类。

  • 通常会以“类名称+类别名称”的风格命名。这并不是硬性的规定,但却是一个好习惯。例如:NSString+NumberAsNSNumber.

类别的声明


#import <Foundation/Foundation.h>

@interface NSString (NumberConvenience)

-(NSNumber *) lenthAsNumber;

@end

声明部分有几个非常有趣的特点。

  1. 类的名称后面是位于括号中的新名称,这意味着类别的名称叫做NumberConvenience,而且它是添加给NSString类的。只要保证类别名称唯一,你可以向一个类中添加任意数量的类别。

  2. 你可以指定想要添加类别的类(上述是NSString)和类别的名称(上述是NumberConvenience),还可以列出你要添加的方法,最后以@end结束。由于不能添加新的实例变量,因此这是不会像类声明那样包含实例变量声明的部分。

  3. 你可以在类别中添加属性,但是不能添加实例变量,而且属性必须是@dynami类型的。

类别的实现


#import "NSString+NumberConvenience.h"
@implementation NSString (NumberConvenience)
-(NSNumber *) lenthAsNumber
{
//获取客串的长度值
NSUInteger length =[self length];
return ([NSNumber numberWithUnsignedInt:length]);
}
@end

类别的实现与声明部分相似。

main函数的实现


#import <Foundation/Foundation.h>

#import "NSString+NumberConvenience.h"

int main(int argc, const char * argv[])

{

@autoreleasepool {

NSMutableDictionary *dict =[NSMutableDictionary dictionary];

[dict setObject:[@"hello" lenthAsNumber] forKey:@"hello"];

[dict setObject:[@"once time" lenthAsNumber] forKey:@"once time"];

NSLog(@"%@",dict);

}

return 0;

}

通过以上步骤我们完成了让程序接收一系列的字符串,然后确定每个字符串的长度并存入到字典中。

这是有几点需要说明

  • @"字符串"这种形式的字符串实际上就是地地道道的NSString对象,它们对消息的响应正如任何其他NSString对象一样。

  • 任何NSString对象都能响应lengthAsNumber消息,包括字面量字符串、可变字符串、其他工具集某部分字符串、文件中加载的字符串、从因特网海量内容中撮的字符串,等等。

类扩展

类扩展的特点

  1. 它不需要名字

  2. 你可以在包含你的源代码的类(也就是你自己的类)中使用它。

  3. 你可以添加实例变量。

  4. 你可以将只读权限改成可读写的权限。

  5. 创建的数量不限


#import <Foundation/Foundation.h>

@interface Things : NSObject

@property (assign) NSInteger thing1;

@property (readonly,assign) NSInteger thing2;

-(void)resetAllValues;

@end

#import "Things.h"

@interface Things ()

{

NSInteger thing4;

}

@property (readwrite,assign) NSInteger thing2;

@property (assign) NSInteger thing3;

@end

这里没有继承的类,我们所做的基本上就是获取Things类,并通过私有属性和方法来扩展它。在这里我们修改了thing2读写权限,我们还添加了私有属性thing3,它只可以在这个类内部使用,另外还添加了thing4这个实例变量,它同样是私有的。

类别的优势与缺陷

优点:

  • 将类的实现代码分散到多个不同的文件或框架中。

  • 创建对私有方法的前向引用。

  • 向对象添加非正式协议。

缺陷:

  1. 类别无法向类中添加新的实例变量。类别没有空间容纳实例变量。

  2. 名称冲突,也就是类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。你的类别方法将完全取代初始方法,导致初始方法不再可用。

类别和继承

  • 为现有的类添加新的行为,通常也可以采用创建子类的方法(继承),
    但是类别是有限制的,如现有的类你没有源代码,或者现有的类是类簇的形式存在。都无法添加新的行为。

时间: 2024-12-28 08:10:04

类别(category)的相关文章

Objective-C日记-之类别Category

类别Category 1,概述 为现有类添加新的方法,这些新方法的Objective-C的术语为“类别”. 2,用法 a,声明类别 @interface NSString(NumberConvenience) -(Number *)lengthAsNumber; @end//NumberConvenience 这里类别的名称就叫NumberConvenience,新的类方法为lengthAsNumber. b,实现类别 @implementation NSString(NumberConveni

类别(Category)与扩展(Extensions)

一.类别(Category) 类别(Category)是一种可以为现有的类(包括类簇:NSString...,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类.类别添加的新方法可以被子类继承. 注:继承(inheritance)无法为一个类簇创建子类.类别不能添加实例变量. 1. 创建类别 1.1 声明类别 类别的声明和类的声明格式相似: @interface ClassName(CategoryName) //method declarations @end//CategoryNa

Objective-C中的协议(Protocol)和类别(Category)

1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的接口,不同点就是在协议里,可以提供可选的方法,不要求全部继承. 协议包括正式协议和非正式协议. 正式协议:其声明一个方法列表,协议的实现者需要实现声明的方法,可以使用@required和@optional关键字指定方法必须实现或可选实现,默认为必须实现.子类会继承其父类采用的协议,一个协议本身也可以

iOS类别(Category)

iOS类别(Category)与扩展(Extension) 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #import @interface NSObject (Category) - (void)myMethod; @end 这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法. 使用Category需要注

iOS类别Category与扩展Extension

本文主要是详解iOS类别(Category)与扩展(Extension,匿名类别),请登陆疯狂软件教育官网.Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. [objc] view plaincopy在CODE上查看代码片派生到我的代码片 #import @interface NSObject (Category) - (void)myMethod; @end 这是一个

分类(类别/Category)与 类扩展(Extension)

一.分类(类别/Category) 1.适用范围 当你已经封装好了一个类(也可能是系统类.第三方库),不想在改动这个类了,可是随着程序功能的增加需要在类中增加一个方法,这时我们不必修改主类,只需要给你原来的类增加一个分类. 将一个大型的类拆分成不同的分类,在不同分类中实现类别声明的方法,这样可以将一个类的实现写到多个.m文件中,方便管理和协同开发. 分类中的方法可以只声明,不实现,所以在协议不支持可选方法的时候(协议现在已经支持可选方法),通常把分类作为非正式协议使用. 2.语法格式 文件中的语

2. revitAPI基础-----类别category

在revitAPI中,Element及其子类都拥有一个category属性用于表示类别,整体调用方式为document.settings.Categories,也可以用BuiltInCategory找出指定的类别 从模型中取到想要的类别: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Autodesk.Revi

1225Delegate 代理委托 +类别Category

1.协议  代理模式 两个对象之间如何传递数据 同一时间只完成一件事情 一般把协议写在代理中 接受的类型用id并且服从协议(@property(nonatomic ,assign)id<agentDelegate>delegate 一定要确保对象实现了方法 2.Category 类别 1.什么是类别 在已有类的基础之上无需子类化,直接给类添加一些方法 a.继承与类别的区别 继承不仅可以添加一些方法,还可以添加一些属性 类别只能添加方法 b.在使用的时候继承必须创建一个对象再去调用方法,使用类别

iOS类别(Category)与扩展(Extension)-b

苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #import @interface NSObject (Category) - (void)myMethod; @end 这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法. 使用Category需要注意的点: (1) Category的方法不一定非要在@imp