进阶阶段要求对底层有一定的认识,要对原理有刨根问底的执着精神。要对知识有全面的认识,要对细节以及注意问题有独特的见解。Extension时经常被面试者提到的问题。

Extension 类扩展可以理解为Category的一个特例,可以用来给当前类添加属性和新方法。其名字可为匿名(为空),也可起一个意义相关的名字。并且新添加的方法一定要予以实现. (Category没有这个限制)。

最熟悉的陌生人

其实类扩展天天看到也用到:

#import "ViewController.h"@interface ViewController () {}
@end
@implementation ViewController

它其实就是一个匿名的Extension。它能添加方法,添加属性。是开发声明私有变量和私有方法最常用的做法。一般默认写在.m文件里面,这样默认只能是Private类型的属性了。类扩展所声明的方法必须依托对应类的实现部分来实现。

三种写法

写法1: 写在.h文件里
Person.h

#import <Foundation/Foundation.h>@interface Person : NSObject
/** name */
@property (nonatomic,strong) NSString * name;
+(void)test;
@end/***  写法1: 写在.h文件里 可以写property, 自动生成set get方法,*  扩展一个run方法 , 必须在.m 文件中实现, 不然有警告.*/
@interface Person()
@property (nonatomic,assign) int age;
- (void)run;
@end

写法2: 写在.m文件里
Person.m

#import "Person.h"/***  写法2: 写在.m文件里, property 自动生成 set,get方法, 只不过是私有变量,不能使包含.h文件的其他文件调用*  声明的方法必须实现, 不然有警告.*/
@interface Person()
/** age */
@property (nonatomic,assign) int age;
- (void)run;
@end@implementation Person
+(void)test{}#pragma mark -- Extent --
-(void)run{}

写法3: 创建Person+extension.h文件之后先导入到.m文件中,不然直接导入其他类中使用属性会崩溃。
Person+extension.h

#import "Person.h"
/***  写法3: 创建之后先导入到.m文件中, 不然连 NSString都没提示, 得生敲, 蛋疼*  增加属性, 可以写@property,包含此文件的.m文件中自动生成 set,get方法.不过是私有的,*/
@interface Person ()
/** age */
@property (nonatomic,assign) int age;
- (void)run;@end

总结

  1. 类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。
  2. 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式
  3. 子类能够继承“写法1、3”的属性和方法。
  4. 扩展的方法只能在原类中实现。例如你扩展NSString,那么你只能在NSString的.m实现(这是不可能的),所以尽量少用扩展。用分类就可以了。
  5. 与的区别继承:
    下面使用继承
    1)新扩展的方法与原方法同名,但是还需要使用父类的实现。
    2)扩展类的属性。
    3)类扩展是在 .m 文件中声明私有方法的非常好的方式。
    4)类扩展可以选择对外公开的扩展的方法属性(比如对同一个类多个类扩展)。

感谢

类扩展(Extension)

iOS进阶之类扩展(Extension)(8)相关推荐

  1. iOS App添加扩展App Extension

    主要参考文章 :  https://www.cnblogs.com/fengmin/p/6118592.html demo地址,里面额外添加了一个分享的扩展 :  https://github.com ...

  2. iOS扩展Extension详解

    扩展Extension是iOS8中引入的非常重要的新特性.扩展让App之间的数据交互成为可能.用户可以在App中使用其他应用提供的功能,而无需离开当前的应用. 在iOS8之前,每一个App在物理上都是 ...

  3. Mybatis-Plus进阶之扩展插件

    文章目录 Mybatis-Plus进阶之扩展插件 1.逻辑删除 2.自动填充 3.乐观锁 4.执行sql分析打印 5.多租户实现 6.动态表名解析 7.sql注入器 和 选装件 Mybatis-Plu ...

  4. WWDC 2014 Session笔记 - iOS 通知中心扩展制作入门

    转自:http://onevcat.com/2014/08/notification-today-widget/ 总览 扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个 ...

  5. iOS 通知中心扩展制作入门

    from:http://onevcat.com/2014/08/notification-today-widget/ 扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个非 ...

  6. iOS开发--iOS通知中心扩展制作入门(iOS Extensions)

    个人笔记: 通知中心扩展,相当于一个特殊的独立的App存在.他和主App之间通讯可以通过OpenURL来实现.而在通知中心内部,像App一样,该咋样还是咋样(如异步网络请求, 自动布局等).  之所以 ...

  7. iOS进阶之架构设计MVVM的理解(3)

    iOS进阶之架构设计MVC(1) iOS进阶之架构设计MVP(2) 前言: 前两篇文章已经理解MVC.MVP的设计模式.特别是MVP,比较难以理解,不好把握.需要多多实践,对比.来优化P段,找到最适合 ...

  8. 开发腾讯移动游戏平台SDK ios版Ane扩展 总结

    本文记录了在开发 腾讯移动游戏平台SDK(MSDK) ios版Ane扩展 过程中所遇到的问题 文中非常多问题都是基础的问题.对object c和xcode配置了解不深入导致的.(没办法,开发ane的程 ...

  9. iOS进阶 - iOS如何监控崩溃

    转载自:https://blog.csdn.net/qxuewei/article/details/90760508 iOS进阶 - iOS如何监控崩溃 几种常见的崩溃 数组越界:给数组添加 nil: ...

最新文章

  1. Tomcat_7.x压缩版_环境变量配置(亲测有效)
  2. MyEclipse设置默认的文档注释和背景色设置
  3. lstm 和自注意力机制 bert 本质区别的思考历程
  4. 长期使用中型Access数据库的一点经验
  5. jQuery如果选中复选框
  6. 浅谈图片蒙版效果-webkit-mask
  7. JMeter入门案例
  8. 图像相似性搜索的原理
  9. [golang]nil slice和empty slice的区别
  10. PMP读书笔记(第3章)
  11. 多git帐号的SSH key切换
  12. ActiveMQ安装配置
  13. linux查看内核分区,如何根据bootloader中MTD分区信息修改linux内核中的MTD分区
  14. 天池NLP赛道top指南
  15. Seaborn学习笔记4
  16. selenium元素定位——下拉选择框
  17. 课程作业记录10:63位PN码序列扩频通信Matlab仿真
  18. 《SDN核心技术剖析和实战指南》
  19. 认知系列1:认知是什么
  20. 输出边长为n的正六边形(c语言)

热门文章

  1. shell脚本按行读取文件的几种方式
  2. faster rcnn结构
  3. 采用矩阵+深度优先算法解决迷宫问题
  4. ios程序连接真机调试
  5. js中match、replace方法中使用正则表达式
  6. Jquery的$命名冲突
  7. 管道过滤器模式(Pipe and Filter)与组合模式(修改)
  8. 《windows中GSX的管理》之四——cmware-cmd实例
  9. PC Lint 初学
  10. nginx伪静态之try_files和rewrite讲解