Objective-C基础6 : 类别category

1.为什么要有类别?在现有类的基础上做扩展,可以采用继承和组合两种方法来实现,但是OC为什么还要有类别这种方式呢?

想想这样一个应用场景,要创建一个字典,key是字符串,value是字符串的长度。一般的做法是:

        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        NSString* str = @"hello";
        NSNumber* num1 = [NSNumber numberWithUnsignedInt:[str length]];
        [dict setObject:num1 forKey:str];
        str = @"world";
        num1 = [NSNumber numberWithUnsignedInt:[str length]];
        [dict setObject:num1 forKey:str];
         NSLog (@"%@", dict);

由于NSMutableDictionary存储的key-value必须是OC对象,不能存储int等基本的c语言类型,所以上面dict中对象value长度必须是NSNumber类型,每存储一个长度都得调用NSNumber* num1 = [NSNumber numberWithUnsignedInt:[str length]]这行重复代码,类别就可以用来解决这类问题。

另外对于一些没有源码的类,比如NSString类,从NSString继承是一个很糟糕的选择,因为你无法知道NSString内部是怎么实现的,NSString会根据不同的初始化内部创建不同的对象,类别能解决这个问题。

2.类别个人感觉就像C里面的全局函数一样,比如上面的例子,可以传入一个长度,返回一个NSNumber*对象。类型的声明方法:在类的后面加入类别名称并且用括号括起来。

@interface NSString (NumberConvenience)

- (NSNumber *)lengthAsNumber;

@end

NumberConvenience实现很简单

@implementation NSString (NumberConvenience)
- (NSNumber *)lengthAsNumber
{
    NSUInteger length = [self length];

    return ([NSNumber numberWithUnsignedInt:length]);

} // lengthAsNumber
@end

利用协议解决1中重复代码问题如下:

        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        NSString* str = @"hello";
        [dict setObject:[str lengthAsNumber] forKey:str];
        str = @"world";
        [dict setObject:[str lengthAsNumber] forKey:str];
         NSLog (@"%@", dict);

代码清爽简单多了!!!!

3.类别优缺点。

类别缺陷:1)无法添加成员变量 2)容易造成名字冲突。当名字冲突的时候类别中的方法具有高优先级,他将覆盖其他同名名字变成可见的。

类别优点:1)可以将实现代码分散到不同文件或者框架里面去。2)创建对私有方法的引用 3)向对象添加非正式协议(informal protocol)

时间: 2024-10-26 17:22:28

Objective-C基础6 : 类别category的相关文章

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

iOS类别(Category)

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

1 @interface NSString (reverse) 2 3 -(NSString *) reverseString; 4 5 @end 1 @implementation NSString (reverse) 2 3 -(NSString *) reverseString { 4 int length = [self length]; 5 NSMutableString *reversedString; 6 7 reversedString = [[NSMutableString a

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

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

类别(category)

类别(category) 类别:类别是一种为现有的类添加新方法的方式.使用类别你可以为任何类添加新的方法,包括那些没有源代码的类. 通常会以"类名称+类别名称"的风格命名.这并不是硬性的规定,但却是一个好习惯.例如:NSString+NumberAsNSNumber. 类别的声明 #import <Foundation/Foundation.h> @interface NSString (NumberConvenience) -(NSNumber *) lenthAsNum

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.语法格式 文件中的语