iOS分类(Category)和类扩展(Extension)的简单区别

一、分类

1.1 分类简介

• 分类只能增加方法, 不能增加成员变量、@property(可能编译不报错,但是运行有问题)
• 分类可以访问原来类中的成员变量
• 如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略
方法调用的优先级(从高到低)
➢ 分类(最后参与编译的分类优先),只要有分类就优先调用分类,不考虑与主类的编译顺序。
➢ 原来类
➢ 父类
这里写图片描述
Person+PlayGame分类和Person+Study分类以及Person原来类都分别实现了run方法。
这张图展示分类调用顺序。
即使原来类的编译顺序是最后一个,调用Person run方法依旧调用分类中相对顺序在最后编译的分类的run方法。

1.2 示例代码

Person.h

<code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title"><Foundation/Foundation.h></span></span>
<span class="hljs-class"><span class="hljs-keyword">@interface</span> <span class="hljs-title">Person</span> : <span class="hljs-title">NSObject</span></span>
- (<span class="hljs-keyword">void</span>)run;
<span class="hljs-keyword">@end</span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

Person.m

<code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title">"Person.h"</span></span>
<span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">Person</span></span>
- (<span class="hljs-keyword">void</span>)run{
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"本类run。。。"</span>);
}
<span class="hljs-keyword">@end</span></code>

Person+PlayGame.h

<code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title">"Person.h"</span></span>
<span class="hljs-class"><span class="hljs-keyword">@interface</span> <span class="hljs-title">Person</span> (<span class="hljs-title">PlayGame</span>)</span>
- (<span class="hljs-keyword">void</span>)playLol;
- (<span class="hljs-keyword">void</span>)run;
<span class="hljs-keyword">@end</span></code>

Person+PlayGame.m

<code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title">"Person+PlayGame.h"</span></span>

<span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">Person</span> (<span class="hljs-title">PlayGame</span>)</span>
- (<span class="hljs-keyword">void</span>)playLol{
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"此人在玩游戏。。。"</span>);
}
- (<span class="hljs-keyword">void</span>)run{
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"playgame run..."</span>);
}
<span class="hljs-keyword">@end</span></code>

Person+Study.h

<code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title">"Person.h"</span></span>
<span class="hljs-class"><span class="hljs-keyword">@interface</span> <span class="hljs-title">Person</span> (<span class="hljs-title">Study</span>)</span>
- (<span class="hljs-keyword">void</span>)study;
- (<span class="hljs-keyword">void</span>)run;
<span class="hljs-keyword">@end</span></code>

Person+Study.m

<code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title">"Person+Study.h"</span></span>

<span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">Person</span> (<span class="hljs-title">Study</span>)</span>
- (<span class="hljs-keyword">void</span>)study{
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"此人在学习。。。"</span>);
}
- (<span class="hljs-keyword">void</span>)run{
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"study run..."</span>);
}
<span class="hljs-keyword">@end</span></code>

二、

2.1 类扩展(Extension)简介

类扩展是分类的一个特例。
Extension是Category的一个特例。
起名字为匿名,并且添加的方法一定要实现。(category可以不实现)。因此又叫匿名分类。可以为一个类添加额外的变量,方法或者合成属性。
我的理解:
延展就是为类一开始设计没有考虑到的情况增加新的属性方法来弥补。延展的实现如下:

2.2 示例代码

<code class="hljs objectivec has-numbering">Person<span class="hljs-variable">.h</span>
<span class="hljs-preprocessor">#import <span class="hljs-title"><Foundation/Foundation.h></span></span>

<span class="hljs-class"><span class="hljs-keyword">@interface</span> <span class="hljs-title">Person</span> : <span class="hljs-title">NSObject</span></span>

- (<span class="hljs-keyword">void</span>)testRun;
<span class="hljs-keyword">@end</span>
Person_work<span class="hljs-variable">.h</span>
<span class="hljs-preprocessor">#import <span class="hljs-title">"Person.h"</span></span>

<span class="hljs-class"><span class="hljs-keyword">@interface</span> <span class="hljs-title">Person</span> ()</span>
{
    <span class="hljs-keyword">int</span> _height;
}
- (<span class="hljs-keyword">void</span>)run;
- (<span class="hljs-keyword">void</span>)work;
<span class="hljs-keyword">@end</span>

Person<span class="hljs-variable">.m</span>
<span class="hljs-preprocessor">#import <span class="hljs-title">"Person.h"</span></span>

<span class="hljs-preprocessor">#import <span class="hljs-title">"Person_work.h"</span></span>
<span class="hljs-class"><span class="hljs-keyword">@interface</span> <span class="hljs-title">Person</span>()</span>

{
    <span class="hljs-keyword">int</span> _age;
}
- (<span class="hljs-keyword">void</span>)run;
<span class="hljs-keyword">@end</span>

<span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">Person</span></span>
- (<span class="hljs-keyword">void</span>)work{
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"%d"</span>,_age);
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"working。。。"</span>);
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"height is :%d"</span>,_height);
}
- (<span class="hljs-keyword">void</span>)run{
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"running ...."</span>);
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"%d"</span>,_age);
}
- (<span class="hljs-keyword">void</span>)testRun{
    [<span class="hljs-keyword">self</span> run];
    <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"height is :%d"</span>,_height);
}
<span class="hljs-keyword">@end</span></code>

有以下方法实现类扩展:
1. 直接在Person.m文件中用 @interface Person()的方法,然后在类本身的@implementation中去实现扩展的方法;
2. 新建Objective-C文件work,选择Extension,扩展的原类为Person,然后生成Person_work.h头文件,在头文件中扩展属性和方法,同样需要在原类的.m文件中区实现。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值