当前位置: 首页 > news >正文

OC语言学习——详解类别、扩展与协议

类别、扩展与协议

  • 类别(Category)
    • 概念
    • 基本写法
    • 类别的一些特殊性质和用法分析
  • 扩展(Entension)
    • 概念
    • 基本写法
    • 扩展的一些特殊性质和用法分析
  • 协议(protocol)
    • 概念
    • 基本写法
    • 协议的一些特殊性质和用法分析

类别(Category)

概念

  • 类别是给已有类增加新的功能,方法的一种机制
  • 它的作用如下
  1. 给系统类增加功能
  2. 给已有类进行模块上的划分
  3. 为已有类增加新的功能,方法

基本写法

  • 类别创建时通常需要单独创建两个文件用于写类别的.h和.m文件,这一点与正常的类相似,并且类别是在已有类的基础上新增,就需要这样写:
//原有类.h文件@interfaceTime:NSObject//原有类....//方法@end//类别.h文件@interfaceTime(rule)//括号内写的是类别名,这里随便写了个rule....//方法@end

我们可以看到在上面简单的演示中,新建的类别的.h文件需要在已有类的类名基础上用括号括出新增的类别名

这样的类别文件一般是原类名+新功能

类别的一些特殊性质和用法分析

  1. 类别内不能声明自己的实例变量
    • 这是因为类别本身其实就是在编译后往原有类里追加方法,而不改变原有;类的内存,真正原类的内存在编译期就已经确定了

当然,这并不代表类别就不能使用@property,其实是可以的,但是由于类别只追加方法,不改变内存的特性,这样跟在property后面的变量,只会生成它的getter和setter方法
所以就相当于声明了两个方法,getter和setter,需要你手动实现
同时又因为没有生成iver(带下划线前缀的内部变量),所以一般会使用runtime给出的关联对象(可以将它理解为在绑类外部的一个挂载变量的单独区域,底层用哈希表将它实现),来代替原本的iver的功能

  1. 类别在重写了原本的方法后,调用时先调用类别内方法
    • 这是因为类别追加方法的本质是将新写的方法插入原类的方法列表中,而如果有重名,也就是类别将一个方法重写,重写的方法会被插入到原来方法的前面,导致调用时先调用重写的方法
  2. 当然类别因为可以追加方法,所以就可以把它当成是给原有类分区的一个工具
    • 假如现在有一个person类,需要描述两个功能,一个是思维,一个是肢体,就可以用两个类别分隔出两个方向,再在单个的类别里完成各自的任务

扩展(Entension)

概念

  • 扩展在语法上像是一种匿名的类别(但事实上,他们有着完全不同的逻辑,只有语法相似)
  • 扩展和类别相似,都可以为一个已有类添加方法,而扩展不仅可以添加方法,还可以声明私有属性,同时无论是方法还是属性,都只供这个类的内部访问
  • 因为.h文件是对外接口,然而扩展的意义就是声明只有内部访问的方法和属性,所以一般扩展并不写在.h文件中,也不单开文件,而是写在已有类实现的@implementation的前面

基本写法

  • 前面说过,扩展直接写在已有类的.m文件里面,请看如下代码
//原有类.h文件@interfaceTime:NSObject//原有类....//方法@end//原有类.m文件@interfaceTime()//这里括号内啥也不写,所以被很多人称为匿名类别...//可以是方法,也可以是属性@end//类别的写法到这里结束@implementation//原有类实现....@end

扩展的一些特殊性质和用法分析

  1. 扩展和类别不同的地方就在于,拓展是在编译期直接将写的方法或者属性合并入原有类,这也让它在可以拓展方法的同时也能声明属性
  2. 扩展可以重写属性
    • 在原有类.h文件中声明的属性可以设置为只读,但是如果内部想对它修改,就可以使用扩展重写这个属性,把它设置成读写,这样对内可以修改,对外只读,保证了安全性,演示代码如下
    //原有类.h文件@interfacePerson:NSObject@property(nonatomic,strong,readonly)NSString*name;//这里的name是只读的-(instancetype)initWithName:(NSString*)name;@end//原有类.m文件#import"Person.h"@interfacePerson()//这里声明的是类别@property(nonatomic,strong,readwrite)NSString*name;//重写了name属性,这里使用readwrite@end@implementation....@end
    • 上面的重写使用了readwrite,就可以保证在类的内部对这个对象权限是可读写的,对外是只可读的
  3. 扩展只能写在自己实现的类上,不能写在系统类如NSString,NSArray等上面,根本原因是扩展需要改变原类内存布局,但系统类的内存布局不能修改

协议(protocol)

概念

  • 协议⽤于分离规范和实现
  • 协议是⼀组⽅法的声明列表,本身不包含实现,只是定义了⼀个“契约”。任何类只要遵守(@protocol)这个
    协议,就必须实现协议中规定的⽅法(@required),或者可以选择实现(@optional)的⽅法。
  • 协议分为⾮正式协议和正式协议,⾮正式协议就是不⽤任何@,只是在类或⽗类中可选的⽤category添加⼀个
    协议的⽅法,类与继承的类可以选择是否实现这个协议,所以叫做⾮正式协议

基本写法

  • 协议一般单独用一个.h文件写出来
//协议文件.h@protocol协议名<⽗协议1,⽗协议2,...>//零个到多个⽅法定义...@end//某个类的.h文件@interface类名:⽗类<协议1,协议2,...>//这里除了正常的继承外需要在后面加上尖括号括起来的协议名代表遵守该协议....@end

协议的一些特殊性质和用法分析

  1. 协议只能继承协议⽽不能继承类,可以有多个直接⽗协议,也可以不写父协议
  2. 协议只包含⽅法声明,不包含⽅法实现
  3. protocol⾥⾯所有的⽅法都公开访问权限以便⼤家遵守
  4. 假如.m中未实现协议中的⽅法,编译器会报错
  5. 协议还可以声明变量,这个变量所指向的对象所属的类也需要遵守协议,否则会报错
  6. 协议还可以使用@optional和@required来对协议内容进行控制
    • @require之后,@optional或者@end之前的协议⽅法,遵守协议的类必须要实现,否则报错
    • @optional之后,@required或者@end之前的协议⽅法,遵守协议的类可以选择是否实现
http://www.jsqmd.com/news/484436/

相关文章:

  • 点云配准避坑指南:ICP和NDT算法在ROS中的实战对比(附性能测试数据)
  • MATLAB优化求解新选择:CVX配置MOSEK学术版实战
  • 少年赤诚,何惧路遥|一位软件学子的话,让无数人读懂青春真正的重量
  • C/C++实战:Protobuf高效序列化与跨平台数据交换
  • 微服务架构下Spring Cloud Gateway与Spring Security的职责分离与整合实践
  • Unity游戏Demo快速部署Steam全攻略
  • Temporal Fusion Transformer(TFT)与扩散模型融合:时间序列预测新范式
  • Cogito-v1-preview-llama-3B问题排查:常见错误及解决方法汇总
  • Wenshu_Spider: 司法数据自动化采集的4大解决方案
  • STM32MP157开发板USB OTG实战:从TypeC芯片选型到双角色切换全解析
  • eBPF 实用命令行工具详解
  • WorkshopDL:跨平台获取Steam创意工坊资源的创新解决方案
  • Nunchaku-flux-1-dev实战:基于.NET框架开发Windows桌面图像生成工具
  • Dify平台集成效率提升300%:从零搭建企业级AI工作流的7个关键步骤
  • OFA-VE环境部署:ModelScope模型缓存机制与离线推理配置
  • Ubuntu 20.04 LTS换源指南:清华大学镜像源保姆级配置教程
  • 用TF-IDF和PMI构建词向量的5个实战技巧(NLP基础必备)
  • STM32H7+星闪/IoT边缘硬件平台设计
  • Cartographer SLAM 实战:从配置优化到建图避坑指南
  • 从零开始:淘晶驰串口屏复刻苹果时钟的5个关键步骤(含代码解析)
  • 这周群里讨论最多的4个开源项目,收藏!
  • Delphi跨进程通信:三种高效传递字符串的SendMessage/PostMessage实战方案
  • Stable-Diffusion-v1-5-archive赋能电商:虚拟模特试穿与商品背景生成系统
  • vllm优化glm-4-9b-chat-1m显存占用:低资源运行解决方案
  • VSCode远程开发实战:从OpenSSH配置到高效调试
  • 从欧拉到RK4:IMU姿态解算中的数值积分方法选择与实践
  • 音频处理——从波形到数字信号的转换原理
  • ChatTTS企业级部署:支持高并发的语音合成架构设计
  • 旧Mac升级macOS完全指南:让你的老旧设备焕发新生
  • 科哥二次开发Z-Image-Turbo实测:用AI生成极简风格手机壁纸教程