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

iOS Object-C 创建类别(Category) 与使用

有时候使用系统给出类或者第三方的类,但是呢它们自带的属性和方法又太少,不够我们的业务使用,这时候就需要给“系统的类或者第三方类”创建一个类别(Category),把自己的想添加的属性和方法写进来.

Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的

一:创建Category:

1.1. 目录右键 New File --> ios --> Objective-C File (如下图:)

1.2.填写信息

在File 写上类别的名字(理论上是随便起的,但是要做到望名知意,这里我给UIButton创建了一个类别,目的就是为了快速设置UIButton的X,Y,Width,Height 等数据,所以名字叫做GetFrame)

在File Type一栏选择 Categoru

在Class一栏选择你要给什么类创建类别(不仅可以给系统的UIButton,UIView等,还可以给第三方的或者自己创建的类创建类别.例如:可以给自己写的登陆类LoginViewController 创建分类)

1.3完成以上的步骤,就算是给一个已知的类创建了一个类别了.

如果你的Xcode是15.0以上,有可能创建不成功,因为Xcode15缺失了"CategoryNSObject"和"ExtensionNSObject"两个文件夹,解决方法看我上一篇文章:https://mp.csdn.net/mp_blog/creation/editor/141098276

二:使用Category

很多文章都说Category只可以添加方法,不可以添加属性,但是这种说法不完全正确,

事实上, 通过 Category 可以添加 实例方法、类方法、属性;

事实上, 通过 Category 可以添加 实例方法、类方法、属性;

事实上, 通过 Category 可以添加 实例方法、类方法、属性;

但是如果添加了属性,需要开发者自己实现 setter、 getter方法,不然系统会Crash,

PS:网上有很多文章说,Category新增属性的话,需要引入#import<objc/runtime.h> ,但是我不引入也没报错, 不知道是Xcode优化了(Xcode15.2),还是说本来就不需要

2.1.例如:UIButton+GetFrame.h 这个类别添加了 一个 - (void)eat方法, 和 X,Y ,name属性

2.2.在UIButton+GetFrame.m 里实现eat方法 和 X,Y的 set、get、name方法

NSString的name这里需要用到 objc_setAssociatedObject 、objc_getAssociatedObject 这两个方法

2.3.在ViewController里使用.(注意:需要倒入#import "UIButton+GetFrame.h")

特别鸣谢:本文章借鉴了这位作者的思路,感兴趣的朋友可以前往查看:https://www.jianshu.com/p/582cc3174581

相关文章:

iOS Object-C 创建类别(Category) 与使用

有时候使用系统给出类或者第三方的类,但是呢它们自带的属性和方法又太少,不够我们的业务使用,这时候就需要给“系统的类或者第三方类”创建一个类别(Category),把自己的想添加的属性和方法写进来. Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的 一:创建Ca…...

Rocky系统部署k8s1.28.2单节点集群(Containerd)+Kuboard

目录 Kubernetes介绍 Kubernetes具备的功能 Kubernetes集群角色 Master管理节点组件 Node工作节点组件 非必须的集群插件 Kubernetes集群类型 Kubernetes集群规划 集群前期环境准备 开启Bridge网桥过滤 关闭SWAP交换分区 安装Containerd软件包 K8s集群部署方式 集…...

Springboot整合Flowable入门-学习笔记

目录 1、定义流程&#xff08;画图&#xff09; 2、Springboot部署流程 3、Springboot删除所有流程 4、Springboot根据 流程部署ID 查询 流程定义ID 5、Springboot启动(发起)流程 6、Springboot查询任务 6.1全部任务 6.2我的任务&#xff08;代办任务&#xff09; 7、…...

C语言常见的题目

1、 从源码到可执行文件会经历怎样的过程&#xff1f; 预编译&#xff1a;去掉空格、注释&#xff0c;处理预定义的指令&#xff0c;生成处理后的源代码文件。 编译&#xff1a;翻译成汇编代码&#xff0c;生成汇编文件。 汇编&#xff1a;翻译成机器码&#xff0c;生成一个或…...

Android13适配记录

多语言支持&#xff0c;此功能在国内被阉割 配置后在设置内可以选择 <?xml version"1.0" encoding"utf-8"?> <locale-config xmlns:android"http://schemas.android.com/apk/res/android"><locale android:name"zh" …...

Android TV上OTT PWA应用开发的播放器选择:video.js vs exoplayer

跨平台 OTT PWA 应用开发&#xff0c;最方便的当然是选用 video.js 库。但是既然是安卓平台&#xff0c;exoplayer 看起来总是最稳妥的选择 介绍 Exoplayer 是 Android media3 的一个实现&#xff0c;以前是独立出来的&#xff0c;现在已经合并到 androidx.media3 中了。 Vid…...

24.8.14 《CLR via C#》 笔记12

第十五章 枚举类型和位标志 使用枚举类型而不是硬编码的理由&#xff1a;枚举类型更易编写&#xff0c;阅读和维护&#xff1b;枚举类型是强类型枚举类型是值类型&#xff0c;不能定义任何方法&#xff0c;属性或事件&#xff0c;可利用扩展方法向枚举类型添加方法枚举类型定义…...

P2801 教主的魔法

[题目通道](教主的魔法 - 洛谷) 摘要 分块&#xff0c;是一种优雅的暴力&#xff0c;它通过对数列分段&#xff0c;完成对数列一些区间操作和区间查询的操作&#xff0c;是一种根号算法。 这篇学习笔记&题解是本萌新在学习分块过程中的一些感悟&#xff0c;希望能够帮助…...

Go 语言channel的应用场景及使用技巧

通过反映的方式执行 select 语句。这在处理有很多 case 子句,尤其是不定长 case 子句的情况时非常有用。 1. 使用反射操作 select 和 channel 使用 select 语句可以处理 chan 的 send 和 recv, send 和 recv 都可以作为 case 子句。如果需要同时处理两个 chan, 则可以写成下面…...

QLabel设置图像的方法+绘制文本换行显示

1、QLabel设置图像有两种方法 (1) void setPicture(const QPicture &); (2) void setPixmap(const QPixmap &); QPicture和QPixmap都是继承于QPaintDevice&#xff0c;它们都可以通过加载图片的方式获取&#xff1a;bool load(QIODevice *dev, const char *format …...

LVS原理及相关配置

1. 描述以及工作原理 1. 什么是 LVS linux virtural server 的简称&#xff0c;也就是 linxu 虚拟机服务器&#xff0c;这是一个 由章文嵩博士发起的开源项目&#xff0c;官网是 http://www.linuxvirtualserver.org,现在 lvs 已经是 linux 内核标 准的一部分&#xff0c;使用…...

webrtc一对一视频通话功能实现

项目效果 实现原理 关于原理我就不做说明&#xff0c;直接看图 WebRTC建立的时序图 系统用例逻辑 搭建环境 turn服务器&#xff1a;Ubuntu24.04搭建turn服务器 mkcert的安装和使用&#xff1a;配置https访问 必须使用https协议&#xff0c; 由于浏览器的安全策略导致的&am…...

通道(channel)传递数据的例子写一个

当然&#xff01;以下是一个简单的 Go 程序示例&#xff0c;展示了如何使用通道&#xff08;channel&#xff09;在两个 goroutine 之间传递数据。示例代码 go package mainimport ("fmt""time" )// 发送数据到通道的 goroutine func sendData(ch chan int…...

Vue3+Echarts+饼图环形图

记得给容器宽高 <div id"leftChartguawang" style"height: 28vh"></div> 配置函数 const leftChartguawang () > {const chartBox echarts.init(document.getElementById(leftChartguawang))let datas [[{ name: 居民节能建筑, value…...

Python while编程题目|AI悦创Python一对一教学辅导

你好&#xff0c;我是悦创。 以下是十道有创意的while循环编程题目&#xff0c;每道题目都有一定的难度&#xff0c;适合锻炼编程逻辑和思维能力。 题目1&#xff1a;旋转字符串 描述&#xff1a;给定一个字符串&#xff0c;每次循环将字符串的第一个字符移到末尾&#xff0…...

C语言 | Leetcode C语言题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; static inline void swap(int *a, int *b) {int c *a;*a *b;*b c; }static inline int partitionAroundPivot(int left, int right, int pivot, int *nums) {int pivotValue nums[pivot];int newPivot left;swap(&nums[pivot], &a…...

Docker③_VMware虚拟机和Docker的备份与恢复

目录 1. VMware虚拟机的快照备份 1.1 VMware本机的快照备份 1.2 VMware快照备份到另一电脑 2. Docker知识点 2.1 Docker镜像和容器的关系 2.2 Docker的存储卷 2.3 Docker命令简介 2.4 删除Anylink镜像 3. Docker备份和恢复 3.1 确定要回滚的容器和版本 3.2 备份当前…...

【EMC专题】ESD抑制器简要介绍

在ESD保护器件中可以分为陶瓷基类型和半导体基类型。其中有一类陶瓷基类型,使用的机制是电极间放电方法的产品就是ESD抑制器。本文章简要介绍了ESD抑制器的特点、基本结构和特性。 ESD抑制器的特点 ESD抑制器是间隙型的ESD(静电放电 Electrostatic Discharge)对策保护元件,…...

贷齐乐系统最新版SQL注入(绕过WAF可union select跨表查询)

目录 标题&#xff1a;贷齐乐系统最新版SQL注入&#xff08;绕过WAF可union select跨表查询&#xff09; 内容&#xff1a; 一&#xff0c;环境部署 二&#xff0c;源码分析 三&#xff0c;sql注入 总结&#xff1a; [回到顶部]&#xff08;#article_top&#xff09; 一&am…...

『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比!

『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比! 文章目录 一. 虚拟机(Virtual Machine,VM)与Docker对比!1. 定义这两种技术2. 工作原理3. 关于如何选择适合工作负载的技术的指导二. 参考文献Docker 只是一个轻量级的虚拟机吗?虽然二者确实有一个共同点,即 虚…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...