1.需求:如果对一个类在不更改代码的基础上要为它再扩充额外的方法可以使用继承和分类

2.分类

作用:可以在不修改原来类代码的基础上,给某一个类扩充一些对象方法或者类方法,因此一个类可以有多个分类

实现:分类也是类因此也有声明和实现,分类一般以要实现的功能或者模块命名

  • 声明:@interface 类名(分类名称) @end
  • 实现:@implementation 类名(分类名称) @end

3.注意

(1)在分类只能增加方法,不能增加成员变量,如果要增加成员变量的话该考虑用继承去实现

(2)在分类实现方法中可以访问类中的成员变量但是不能访问类中的属性@property

(3)在分类中可以重新实现原类中的方法,但会将原类中的方法覆盖而失效。因为在执行对象成员方法的时候会优先去分类中查找,然后再去原类中去查找,最后去父类   中去查找。但是一般不建议么做!

(4)如果一个类有多个分类,而且分类中有同名的方法那么最后编译的分类会将前面编译的分类覆盖而执行输出

4.总结:

依据分类这一思想:如果一个类中有很多实现功能的方法,那么可以将每一个功能方法单独写成分类,让具体的分类来管理具体的功能!这样的话如果其他类要实现同样功能就可以直接调用分类

在实际开发中一般不建议给自定义的类写分类,一般情况下都是为系统自带的类写分类

举例:Peron类有两个分类Person+QM 和 Person+MM

/*********************** Person.h文件 **********************************/
#import <Foundation/Foundation.h> @interface Person : NSObject
{
int _personCount;
} @property int personCount; - (void)test; @end
/*********************** Person.m文件 **********************************/
#import "Person.h" @implementation Person - (void)test
{
NSLog(@"执行原类 Person 中的test方法");
} @end
/*********************** Person+QM.h文件 **********************************/
#import "Person.h" @interface Person (QQ) - (void)study; - (void)test; @end
/*********************** Person+QM.m文件 **********************************/

#import "Person+QM.h"

@implementation Person (QQ)
- (void)study
{ NSLog(@"学习");
} // 将原来Person的test覆盖
- (void)test
{
NSLog(@"执行分类 Person+QM 中的test方法");
}
@end
/*********************** Person+MM.h文件 **********************************/

#import "Person.h"

@interface Person (MM)

- (void)test;

@end
/*********************** Person+MM.m文件 **********************************/

#import "Person+MM.h"

@implementation Person (MM)
- (void)test
{
NSLog(@"执行分类 Person+MM.h 中的test方法");
}
@end
/*********************** main.m文件 **********************************/
#import <Foundation/Foundation.h>
#import "Person+QM.h"
#import "Person.h"
int main(int argc, const char * argv[])
{
Person *person = [[Person alloc] init]; [person test]; [person study]; return ;
}

输出:

2014-03-06 14:07:04.281 分类[898:303] 执行分类 Person+QM 中的test方法

2014-03-06 14:07:04.282 分类[898:303] 学习

为什么会输出分类Person+QM中的方法呢,这个和编译顺序有关系

iOS 分类思想(1)的更多相关文章

  1. iOS 分类思想(2)

    /******************* NSString+NumCount.h文件 ******************************/ #import <Foundation/Fo ...

  2. iOS分类、延展和子类的区别

    iOS分类.延展和子类的区别 类别.延展.子类的区别   类别 延展 子类 功能 为类添加方法,不用知道类的源码,添加变量(通过运行时,具体参考下面注解) 为类添加私有变量和私有方法,在类的源文件中书 ...

  3. iOS分类底层实现原理小记

    摘要:iOS分类底层是怎么实现的?本文将分如下四个模块进行探究分类的结构体编译时的分类分类的加载总结本文使用的runtime源码版本是objc4-680文中类与分类代码如下//类@interfaceP ...

  4. IOS编程思想

    从今天起想走进IOS架构的大门,一直不屑于学习第三方框架,觉得框架也是一点点代码给垒起来的,只要掌握了代码就可以了,殊不知垒代码的过程才是最重要的,而这个过程又岂是一朝一夕就能达到完美境界的,达到完美 ...

  5. iOS 分类和继承

    iOS 中分类(Categories) 和 继承(Inherit)有相同的功能,但在一些细节上又有差异,简单介绍一下两者的异同. 分类可以在不知道系统类源代码的情况下,为这个类添加新的方法.分类只能用 ...

  6. iOS分类

    ios中的分类其实就是把两个类用两个或多个文件写的,,在平时的开发中我们会发现有的时候我们想要一个类多个什么功能  但是已经定义好的类中没有,,我们又不想更改我们的程序  那么现在的这种情况下我就可以 ...

  7. HUST 1698 - 电影院 组合数学 + 分类思想

    http://acm.hust.edu.cn/problem/show/1698 题目就是要把一个数n分成4段,其中中间两段一定要是奇数. 问有多少种情况. 分类, 奇数 + 奇数 + 奇数 + 奇数 ...

  8. iOS 编程思想

    一 面向过程编程: 处理事情以过程为核心,一步一步的实现 二 面向对象编程: 万物皆对象 三 链式编程思想: 将多个操作通过点链接在一起成为一句代码 特点:方法返回值是Block,block必须有一个 ...

  9. ios 分类(Category)

      今天研究了类别,都是网上找的资料,类别的作用 类别主要有3个作用:       (1)将类的实现分散到多个不同文件或多个不同框架中.       (2)创建对私有方法的前向引用.       (3 ...

随机推荐

  1. iOS开发-自动布局和自动旋转

    今天学习自动布局中的自动调整尺寸大小. 一.尺寸分类 尺寸分类是对设备宽高的一种大致分类. 有两种具体的尺寸分类用来表示真机:紧凑(Compact)和标准(Regular).还有第三种分类可以在设计工 ...

  2. ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中

    如果解决ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中 手机平台性能是个关键问题. 压缩视频分成3个步骤: 读取显卡数据, 使用编码器压缩,保存文件. 使用libav 压缩的 ...

  3. 使用openssl库实现des,3des加密

    原文地址: 使用openssl库实现des,3des加密 主要是调整了一下格式,以及一些变量的类型,以解决在VC2008下无法编译通过的问题. #include <stdio.h> #in ...

  4. JBoss7快速入门

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  5. 从零开始学android开发-Json转换利器Gson之实例

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: h ...

  6. SVN安装笔记

    1.先去以下网址去下载服务器端与客户端的SVN 2.服务端SVN的安装 点击next 点击next 再点击next 点击next 点击install 点击Finish,这样服务器端的SVN就安装好了, ...

  7. Linux PAM&&PAM后门

    Linux PAM&&PAM后门 我是壮丁 · 2014/03/24 11:08 0x00 PAM简介 PAM (Pluggable Authentication Modules )是 ...

  8. [置顶] 博客已迁移至ryantang.me

    大家好,感谢大家一直以来的支持,本博客内容已停止更新,新内容将发布到我的新博客,地址是:ryantang.me,欢迎大家继续支持,我会在ryantang.me上发布内容更丰富的文章内容,谢谢! Rya ...

  9. Oracle建表实例

    建表一般来说是个挺简单的事情,但是Oracle的建表语句有很多可选的参数,有些我们可能平时不太用,用的时候又不知道怎么用,这里就写一个较完整的建表的例子: CREATE TABLE banping  ...

  10. Linux批量替换文件内容

    问题描述:现在需要将rack1目录下*.send文件中的"-ip="替换成“-localIp=10.0.0.1/n-ip=” 刚才那个批量文本内容替换,只能替换内存中的内容,并不会 ...