iOS进阶之类扩展(Extension)(8)
进阶阶段要求对底层有一定的认识,要对原理有刨根问底的执着精神。要对知识有全面的认识,要对细节以及注意问题有独特的见解。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
总结
- 类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。
- 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。
- 子类能够继承“写法1、3”的属性和方法。
- 扩展的方法只能在原类中实现。例如你扩展NSString,那么你只能在NSString的.m实现(这是不可能的),所以尽量少用扩展。用分类就可以了。
- 与的区别继承:
下面使用继承
1)新扩展的方法与原方法同名,但是还需要使用父类的实现。
2)扩展类的属性。
3)类扩展是在 .m 文件中声明私有方法的非常好的方式。
4)类扩展可以选择对外公开的扩展的方法属性(比如对同一个类多个类扩展)。
感谢
类扩展(Extension)
iOS进阶之类扩展(Extension)(8)相关推荐
- iOS App添加扩展App Extension
主要参考文章 : https://www.cnblogs.com/fengmin/p/6118592.html demo地址,里面额外添加了一个分享的扩展 : https://github.com ...
- iOS扩展Extension详解
扩展Extension是iOS8中引入的非常重要的新特性.扩展让App之间的数据交互成为可能.用户可以在App中使用其他应用提供的功能,而无需离开当前的应用. 在iOS8之前,每一个App在物理上都是 ...
- Mybatis-Plus进阶之扩展插件
文章目录 Mybatis-Plus进阶之扩展插件 1.逻辑删除 2.自动填充 3.乐观锁 4.执行sql分析打印 5.多租户实现 6.动态表名解析 7.sql注入器 和 选装件 Mybatis-Plu ...
- WWDC 2014 Session笔记 - iOS 通知中心扩展制作入门
转自:http://onevcat.com/2014/08/notification-today-widget/ 总览 扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个 ...
- iOS 通知中心扩展制作入门
from:http://onevcat.com/2014/08/notification-today-widget/ 扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个非 ...
- iOS开发--iOS通知中心扩展制作入门(iOS Extensions)
个人笔记: 通知中心扩展,相当于一个特殊的独立的App存在.他和主App之间通讯可以通过OpenURL来实现.而在通知中心内部,像App一样,该咋样还是咋样(如异步网络请求, 自动布局等). 之所以 ...
- iOS进阶之架构设计MVVM的理解(3)
iOS进阶之架构设计MVC(1) iOS进阶之架构设计MVP(2) 前言: 前两篇文章已经理解MVC.MVP的设计模式.特别是MVP,比较难以理解,不好把握.需要多多实践,对比.来优化P段,找到最适合 ...
- 开发腾讯移动游戏平台SDK ios版Ane扩展 总结
本文记录了在开发 腾讯移动游戏平台SDK(MSDK) ios版Ane扩展 过程中所遇到的问题 文中非常多问题都是基础的问题.对object c和xcode配置了解不深入导致的.(没办法,开发ane的程 ...
- iOS进阶 - iOS如何监控崩溃
转载自:https://blog.csdn.net/qxuewei/article/details/90760508 iOS进阶 - iOS如何监控崩溃 几种常见的崩溃 数组越界:给数组添加 nil: ...
最新文章
- Tomcat_7.x压缩版_环境变量配置(亲测有效)
- MyEclipse设置默认的文档注释和背景色设置
- lstm 和自注意力机制 bert 本质区别的思考历程
- 长期使用中型Access数据库的一点经验
- jQuery如果选中复选框
- 浅谈图片蒙版效果-webkit-mask
- JMeter入门案例
- 图像相似性搜索的原理
- [golang]nil slice和empty slice的区别
- PMP读书笔记(第3章)
- 多git帐号的SSH key切换
- ActiveMQ安装配置
- linux查看内核分区,如何根据bootloader中MTD分区信息修改linux内核中的MTD分区
- 天池NLP赛道top指南
- Seaborn学习笔记4
- selenium元素定位——下拉选择框
- 课程作业记录10:63位PN码序列扩频通信Matlab仿真
- 《SDN核心技术剖析和实战指南》
- 认知系列1:认知是什么
- 输出边长为n的正六边形(c语言)