iOS分类(Category)和类扩展(Extension)的简单区别
来源:互联网 发布:caffe 测试集 验证集 编辑:程序博客网 时间:2024/05/16 17:21
一、分类
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文件中区实现。
- iOS分类(Category)和类扩展(Extension)的简单区别
- iOS分类(Category)和类扩展(Extension)的简单用法
- ios 分类(category)和类扩展(extension)详解
- 分类(category)和类扩展(extension)
- IOS 分类(category)、扩展(Extension)和继承(inheritance)的区别?
- iOS 类别 (category)和 类扩展 (extension)的区别
- 分类 & 类扩展(category / extension)
- OC 分类(category) 和 类扩展(extension)
- 深入浅出理解分类(category)和类扩展(extension)
- 深入浅出理解分类(category)和类扩展(extension)
- ios的类别(category)和扩展(Extension)
- 关于分类category与类扩展extension的区别
- iOS 分类(category)、扩展(Extension)
- 分类(category)和类扩展(extension)的关系
- Category(类别)和扩展(Extension)的区别
- iOS类别和扩展(category和extension)
- iOS 类别和扩展(Category和Extension)
- 【IOS开发技术】 Objective-C分类 (category)和扩展(Extension)
- 世界六大银行卡组织
- Android 获取充电状态
- 通过照相机拍照或者图库选择图片上传给服务器作为头像
- 文件解析漏洞总结
- Nmap Cheat Sheet Part 1
- iOS分类(Category)和类扩展(Extension)的简单区别
- 探知Java虚拟机——初识Java
- nmap学习笔记
- 安装及使用yuicompressor
- Android之drawable state各个属性详解
- Type Java compiler level does not match the version of the installed Java project facet
- 【solr】【IKAnalyzer】关于IKAnalyzer与solr以及lucene的版本关系
- Oracle 使用MERGE INTO 语句更新数据的脚本
- hibernate ehcache