类目和延展的作用都是为了扩展一个类。

Objective-C中的类目(Category)

一、类目的定义和作用

类目也叫分类,英文Category,在没有原类.m文件的基础上,给该类添加方法。

比如,NSString类原本没有helloString方法,我们又没有NSString类的原代码,那我们想给NSString类添加一个helloString的方法,只有通过声明子类或者类目才可以达到这个目的。

二、类目的声明:

@interfaceNSString (hello)

- (void)helloString;

@end

三、类目实现:

@implementationNSString (hello)

- (void)helloString

{

NSLog(@"my name is %@,I am a string",self);

}

@end

文件名:

NSString+hello.h

使用:

NSString * str = @"我要上天";

[strhelloString];

打印输出:

my name is 我要上天,I am a string

helloString 实现里面用到的self就是调用这个方法的实例本身。

四、类目使用需要注意的问题:

1、类目里不能添加实例变量,但是类目声明可以用属性,其实属性就是一对儿方法,那么在.m里面需要实现这个属性的setter方法和getter方法,在这两个实现方法里面依然不能使用自己添加的实例变量。

2、类目里添加的方法不能和原始类中的方法重名,否则会导致覆盖。

3、一个类可以添加多个类目,但是类目名和方法名不能重复。

4、类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承。

局限性: 在类目中只可以为类添加方法,不能添加实例变量; 类目中得方法的优先级要高。

Objective-C中的延展(Extension)

延展也叫Extension:

延展是一种特殊形式的类目,主要是在一个类的.m里面声明与实现

延展的作用:就是给某类添加私有方法或私有变量

比如RootViewController.m

@interface RootViewController ()

{

NSString * aString ;

}

- (void)test1;

- (void)test2;

@end

@implementation RootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

self = [super initWithNibName:nibNameOrNilbundle:nibBundleOrNil];

if (self) {

// Custom initialization

}

return self;

}

@end

上面@interface @end定义的就是一个延展,主要定义了RootViewController的私有方法和私有变量。

五、使用延展需要注意的几个问题:

1、如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有名,则认为是可选实现。

2、虽然延展是给一个类定义私有方法,但是没有OC没有绝对的私有方法,其实还是可以调用,另外延展里面声明的变量只能在该类内部使用,外界访问不了。

3、如果是新建文件建的某类延展.h文件,则不能加实例变量。

Objective-C中的类目(Category),延展(Extension)的更多相关文章

  1. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  2. OC中协议, 类目, 时间, 延展, 属性

    只有继承和协议需要引IMPORT "头文件"; 必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @pr ...

  3. object-c中的类目,延展,协议

    协议 协议只有方法的声明(类似于其他编程语言的接口)   协议相当于大家都所遵循的 关键字 @protocol 协议名 <所遵循的协议> 默认NSObject   @end     @pr ...

  4. objective-c 类目(Category)和延展(Extension)

    类目的基本概念: 如果有封装好的一个类,随着程序功能的增加,需要在类中增加一个方法,那我们就不必在那个类中做修改或者再定义一个子类,只需要在用到那个方法时添加一个该类的类目即可. 1.在类目定义的方法 ...

  5. iOS类目、延展和协议

    类目:为已知的类增加新的方法:注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用 1.类目无法向已有类中添加实例变量.2.如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优 ...

  6. Java生鲜电商平台-生鲜电商中商品类目、属性、品牌、单位架构设计与实战

    Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战 说明:Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战经验分享 凡是涉及到购物,必然是建立在商品的基础 ...

  7. OC 中 类目、延展和协议

    Category : 也叫分类,类目. *是 为没有源代码的类 扩充功能 *扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承 *该方法只能扩充方法,不能扩充实例变量 ...

  8. iOS -类目,延展,协议

    1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...

  9. Object-C里的类目,延展,协议

    1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...

随机推荐

  1. 记录一次webbrowser无法加载 activex 遇到的问题

    关联配置: win7 x64 Adobe Reader XI activex 安装目录X84 笔者项目运行Any CPU 无论如何也加载不出PDF 刚开始还以为自己封装的控件XWebBrowser的问 ...

  2. SQL数据库关键字和列名冲突处理

    在设计SQL数据库的时候可能由于考虑不全,使列名和数据库内关键字冲突,可能导致Query不能被正确识别,对列名要加[]处理.

  3. php开发中的一些常用统计的日期

    <?php echo '<br>今天:<br>'; echo date("Y-m-d",strtotime("now")), &q ...

  4. Android 学习开发笔记《Service 与 Thread 的区别 》

    很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...

  5. Python之三层菜单

    三层菜单,根据用户所选数字,进入子菜单.一级一级呈现. menu = { 'Beijing': { "ChaoYang": { "CBD": ['CICC', ...

  6. [LeetCode]题解(python):134-Gas Station

    题目来源: https://leetcode.com/problems/gas-station/ 题意分析: 在一个圈子路线里面有N个汽油站,i站的汽油有gas[i]汽油.现在有一辆无限容量的车,它从 ...

  7. Dokcer 组成原理简介

    首先来张图了解Docker的组成 重要 Docker在启动容器的时候,需要创建文件系统,为rootfs提供挂载点.最初Docker仅能在支持Aufs文件系统的Linux发行版上运行,但是由于Aufs未 ...

  8. 10,随机等概率的输出m个不重复的数

    今天看到一段代码,可以从0.....n-1中随机等概率的输出m个不重复的数(n远远大于m).遂记录下来. 首先,产生随机数,不免要用到srand,rand函数.先简单介绍下两个函数. 1,void s ...

  9. RFID介绍及电子标签成本预估

    What is RFID • RadioFrequencyIdentification, (無線射頻識別系統)• 通常是由感測器(Reader)和RFID標籤(Tag)所組成的系統 RFID分類 • ...

  10. Ubuntu Linux: How Do I install .deb Packages?

    Ubuntu Linux: How Do I install .deb Packages? Ubuntu Linux: How Do I install .deb Packages? by Nix C ...