关于iOS 类扩展Extension的进一步理解
2024-09-25 12:27:44
很多人可能会问 iOS的分类和扩展的区别,网上很多的讲解,但是一般都是分类讲的多,而这也是我们平常比较常用的知识;但是,对于扩展,总觉得理解的朦朦胧胧,不够透彻。
这里就讲一下我自己的理解,但是这个理解也是集合了前辈的经验来的,只不过我用大白文再延伸一点。
对于类扩展,先看下面的概念:
能为某个类附加额外的属性,成员变量,方法声明
一般的类扩展写到.m文件中
一般的私有属性写到类扩展
使用格式:
@interface Mitchell()
//属性
//方法
@end
与分类的区别:
分类的小括号中必须有名字 @interface 类名(分类名字)
/*方法声明*/
@end
@implementation类名(分类名字)
/*方法实现*/
@end
分类只能扩充方法,不能扩展属性和成员变量(如果包含成员变量会直接报错,runtime实现除外)。
如果分类中声明了一个属性,那么分类只会生成这个属性的set、get方法声明,也就是不会有实现(不会生成成员变量)。
那么,如何创建一个扩展呢:
通过New File -> Objective-C extension来创建,比如我选择ASStudent类,延展名叫hello,那么会自动创建一个.h文件叫ASStudent_hello.h, 没有.m文件,因为可以直接在类的.m里写即可。(这个也正是和分类的不同,分类会有.h 和 .m)
其实,对于只有.h文件这点,有些人可能就比较疑惑,只有一个头文件,怎么和分类不一样?
这正是扩展的不一样,它只会创建一个头文件,我们在里面可以添加成员变量、属性、方法等;如果要实现,只需要在它要扩展的类 .m文件去实现即可。
其实可以理解成原有类多了一个.h文件,但写在这个头文件里面的属性、方法等,都是私有的,只能被这个类所拥有访问。
到这里,大家有没有觉得和一种场景很熟悉?
对了,就是 .m文件里的定义属性,有时我们不会在.h里写属性,因为那样会变成public,只要import后,外部都可以访问。
如果我们只想当前类用一下,只需要写在.m里面,这样的属性或方法其实也是扩展的一种特殊情况啦。。。
摘自网上的一段话:
a:我们可以不通过创建文件来创建延展,可以直接在.m文件里写@interface和@implementation, 注意这两个都要写在.m文件里,因为如果把@interface写在.h里,那么里面的方法都是public的;
b:此外,我们也可以直接省略@interface,直接在.m文件里写方法即可,但还是建议书写@interface,这样的好处是可阅读性强,可以在文件一开始的几行就告知了哪些是私有方法。
这正好解释了,为什么大神会说扩展其实无处不在了。
理解的浅薄,如有不对,欢迎留言。。
最新文章
- white-space: nowrap 与字符串(文本)换行
- BZOJ2330 糖果题解 查分约束
- lua安装和简单使用
- 【Android车载系统 News | Tech 4】知乎--车载话题链接
- C# Socket连接请求超时机制
- dubbo 运行过程
- Android消息机制(2)
- 安装Eclipse Html Editor
- JS弹出框
- [UIKit学习]08.关于自定义控件
- 《跟我学IDEA》五、快捷键(编码利器)
- rabbitMq及安装、fanout交换机-分发(发布/订阅)
- 安全工具-Hydra
- Codeforces 1100 - A/B/C/D/E/F - (Undone)
- mycat 入门使用例子
- nodejs -- 主模块 ,初始化.
- 什么是pytorch(3神经网络)(翻译)
- 最小生成树&;&;最大生成树模板
- 手机闪存速度测试工具,AndroBench
- 两种常用文件分享方式 - 网络硬盘快速分享, 点对点的文件共享 BitTorrent Sync
热门文章
- mac OS X下配置jdk环境变量
- 《疯狂iOS讲义(下)——iPhone/iPad高级应用与手游开发(含CD光盘1张)》
- 使用cxf开发webservice接口
- javascript和python取dict字典对象的不同
- 【BZOJ】【3170】【TJOI2103】松鼠聚会
- 1、cocos2d-x环境安装
- Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:
- CF 327B. Hungry Sequence
- 支持5G-WiFi的安卓设备搜索不到5G信号解决方法
- Android开发之Drag&;Drop框架实现拖放手势