iOS杂记——category分类、extension扩展、protocol协议

OC中的类别Category-协议Protocol-扩展Extension 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中。通常只在类别中定义方法。  类别,接口部分的定义,通常该文件命名为已有"类+类别名.h" @interface 已有类 (类别名) //.......方法实现 @end #import #import "Buy.h"@interface Person : NSObject 阅读详情

protocol   本质就是一系列的method的声明,他并不像class是必须的选项,根据自己的设计模式来选择性的使用。


 protocol协议时为了补充Objective-C 只能单继承的缺陷而增加的一个新功能。Objective-C重所有的方法都是虚方法,所以在oc重也就没有关键字 virtual一说,有了协议可以补充

Objective-C单继承的缺陷,协议并不是一个真正的类,在协议的里面只声明方法不实现,并且在协议当中不能声明实例变量,如果一个类实现了某一个协议的方法,那么称折各类遵

循(遵守,采用)了这个协议,正式的协议在类中必须被实现,一个类可以实现多个协议,一个协议也可以被多个类实现,


Category

http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html

—Category—
首先我们来谈谈Category。
 
Objective-C提供了一种与众不同的方式——Category,可以动态的为已经存在的类添加新的行为。这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。使用Category对类进行扩展时,不需要访问其源代码,也不需要创建子类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。
 
实现起来很简单,我们举例说明。
SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end 
 
这是类SomeClass的声明文件,其中包含一个实例方法print。如果我们想在不修改原始类、不增加子类的情况下,为该类增加一个hello的方法,只需要简单的定义两个文件SomeClass+Hello.h和SomeClass+Hello.m,在声明文件和实现文件中用“()”把Category的名称括起来即可。声明文件代码如下:
 
#import "SomeClass.h"
 
@interface SomeClass (Hello)
-(void)hello;
@end
实现文件代码如下
#import "SomeClass+Hello.h"
@implementationSomeClass (Hello)
-(void)hello{
    NSLog (@"name:%@ ", @"Jacky");
}
@end 
其中Hello是Category的名称,如果你用XCode创建Category,那么需要填写的内容包括名称和要扩展的类的名称。这里还有一个约定成俗的习惯,将声明文件和实现文件名称统一采用“原类名+Category”的方式命名。
调用也非常简单,毫无压力,如下:
首先引入Category的声明文件,然后正常调用即可。
#import "SomeClass+Hello.h"
 
SomeClass * sc =[[SomeClass alloc] init];
[sc hello] 
执行结果是:
name:Jacky 
 
Category的使用场景:
1、当你在定义类的时候,在某些情况下(例如需求变更),你可能想要为其中的某个或几个类中添加方法。
2、一个类中包含了许多不同的方法需要实现,而这些方法需要不同团队的成员实现
3、当你在使用基础类库中的类时,你可能希望这些类实现一些你需要的方法。
 
遇到以上这些需求,Category可以帮助你解决问题。当然,使用Category也有些问题需要注意,
1、Category可以访问原始类的实例变量,但不能添加变量,如果想添加变量,可以考虑通过继承创建子类。
2、Category可以重载原始类的方法,但不推荐这么做,这么做的后果是你再也不能访问原来的方法。如果确实要重载,正确的选择是创建子类。
3、和普通接口有所区别的是,在分类的实现文件中可以不必实现所有声明的方法,只要你不去调用它。
 
用好Category可以充分利用Objective-C的动态特性,编写出灵活简洁的代码。
—Protocol— 
下面我们再来看Protocol。
Protocol,简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现。这种模式一般称为代理(delegation)模式。你通过Protocol定义各种行为,在不同的场景采用不同的实现方式。在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View和Controller的解耦。
 
定义Protocol很简单,在声明文件(h文件)中通过关键字@protocol定义,然后给出Protocol的名称,方法列表,然后用@end表示Protocol结束。在@end指令结束之前定义的方法,都属于这个Protocol。例如:
复制代码
@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;

@optional
- (id) submitOrder: (NSNumber *) orderid;
@end
复制代码
 
以上代码可以单独放在一个h文件中,也可以写在相关类的h文件中,可以视具体情况而定。该Protocol包含两个方法,processSuccessful和submitOrder。这里还有两个关键字,@required和@optional,表示如果要实现这个协议,那么processSuccessful方法是必须要实现的,submitOrder则是可选的,这两个注解关键字是在Objective-C 2.0之后加入的语法特性。如果不注明,那么方法默认是@required的,必须实现。
 
那么如何实现这个Protocol呢,很简单,创建一个普通的Objective-C类,取名为TestAppDelegate,这时会生成一个h文件和m文件。在h文件中引入包含Protocol的h文件,之后声明采用这个Protocol即可,如下:
@interface TestAppDelegate : NSObject<ProcessDataDelegate>;

@end
用尖括号(<...>)括起来的ProcessDataDelegate就是我们创建的Protocol。如果要采用多个Protocol,可以在尖括号内引入多个Protocol名称,并用逗号隔开即可。例如<ProcessDataDelegate,xxxDelegate>
 
m文件如下:
复制代码
@implementation TestAppDelegate

- (void) processSuccessful: (BOOL)success{
    if (success) {
        NSLog(@"成功");
    }else {
        NSLog(@"失败");
    }
}

@end 
复制代码
由于submitOrder方法是可选的,所以我们可以只实现processSuccessful。
 
Protocol一般使用在哪些场景呢?Objective-C里的Protocol和Java语言中的接口很类似,如果一些类之间没有继承关系,但是又具备某些相同的行为,则可以使用Protocol来描述它们的关系。不同的类,可以遵守同一个Protocol,在不同的场景下注入不同的实例,实现不同的功能。其中最常用的就是委托代理模式,Cocoa框架中大量采用了这种模式实现数据和UI的分离。例如UIView产生的所有事件,都是通过委托的方式交给Controller完成。根据约定,框架中后缀为Delegate的都是Protocol,例如UIApplicationDelegate,UIWebViewDelegate等,使用时大家可以留意一下,体会其用法。
 
使用Protocol时还需要注意的是:
1、Protocol本身是可以继承的,比如:
@protocol A
     -(void)methodA;
@end
@protocol B <A>
     -(void)methodB;
@end

如果你要实现B,那么methodA和methodB都需要实现。 

2、Protocol是类无关的,任何类都可以实现定义好的Protocol。如果我们想知道某个类是否实现了某个Protocol,还可以使用conformsToProtocol进行判断,如下:
[obj conformsToProtocol:@protocol(ProcessDataDelegate)] 
 
好吧,具体的语言特性这次就介绍这么多。从某种意义上来说,Objective-C是一门古老的语言,发明于1980年。1988年,乔布斯的Next公司获得了Objective-C语言的授权,并开发出了Objective-C的语言库和NEXTSTEP的开发环境。NextStep是以Mach和BSD为基础,Objective-C是其语言和运行库,后来的事大家都清楚,苹果买了Next,乔布斯回归苹果,开始神奇的苹果振兴之路,NextStep成了Max OS X的基础。以后发展越来越好,Objctive-C成了Apple的当家语言,现在基本上是Apple在维护Objctive-C的发展。
 
在苹果的AppStore推出之前,Objective-C一直相对小众,但是其优秀的语言特性似乎一直在为后面的爆发积蓄力量,当苹果平台级的应用出现之后,Objective-C开始大放异彩,静态语言的效率和动态语言的特性得到众多程序员的喜爱,目前它已经以火箭般的速度蹿升TIOBE语言排行版第四位。
 
对于喜爱苹果技术的技术人员来说,Objective-C是你必须深入了解和值得学习的一门语言,希望以后有机会多写一些相关的文章。


Extension
extension可以 理解成匿名的category,同样需要括号。
下面就是隐藏私有实现的一个例子,也是extension一个常用的方式。

@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end
我的博客OC第七天(OC中延展(protocol)的使用步骤) 在OC中, 延展的使用在以后IOS开发过程中是很普遍很常用的, 在这里简单的介绍了延展的使用方法以及步骤 ,希望对你有帮助. 立即下载

相关推荐

基于PCIe的NVMe协议在FPGA中实现方法

NVMe协议是工作在PCIE的最上层协议层的,故需要先搞清楚PCIE。本文基于Xilinx的UltraScale+,开发工具为Vivado2021.2。NVMe的学习仍以spec为主,其它资料辅助理解,有冲突时以spec为准,必要时可对比最新版本spec。(此文重点介绍学习方法及资料,有时间再加细节)。 主要参考的文章是《老男孩读PCIe》,同时参考《古猫先生》,重点学习TLP报文部分,数据链路层和物理层的内容可以先不看。再买一本书《PCI Express 体系结构导读-王齐》用来查阅做笔记。

leixj的博客 1万+

ios开发(六):基本语法 protocols Category extension

protocol   本质就是一系列的method的声明, TODO

Coder 3628

基因树构建全流程:从OrthoFinder到iTOL的保姆级教程(附兰科植物案例)

本文提供了一份从OrthoFinder到iTOL的基因树构建全流程保姆级教程。详细解析了利用OrthoFinder构建物种树、IQ-TREE构建无根基因树、Notung进行树调和生根,以及最终在iTOL中实现专业可视化的每一步操作与实战经验,并以兰科植物NB-ARC基因家族为例进行演示,帮助研究者系统掌握基因树分析方法。

tequila的博客 523

Swift中扩展extension与协议protocol

原文:http://blog.youkuaiyun.com/xn4545945  一、扩展(extension) 扩展 extension (类似OC中的分类, 但Swift中没有名字), 即在没有权限获取到原始代码的情况下, 为类增加新功能. 注意: 只要定义了扩展, 那么该扩展对该类的实例都是可用的. [java] view plaincopy

LiangDon的博客 971

告别手工AS91/AB01L:用BAPI_FIXEDASSET_OVRTAKE_CREATE实现SAP资产历史数据自动化迁移

本文详细解析了如何利用BAPI_FIXEDASSET_OVRTAKE_CREATE实现SAP资产历史数据的自动化迁移,替代传统手工操作如AS91/AB01L。通过核心参数解析、迁移逻辑说明及实战案例,帮助顾问团队提升资产和折旧数据迁移的效率与准确性,确保数据一致性并降低错误风险。

weixin_42524708的博客 418

工业异常检测评价指标(I-AUROC、PRO等)

模型评价指标:TPR、FPR、Recall、ROC、AUC、AUROC、IoU、PRO、AUPRO等

qq_1532145264的博客 7434

第六节 Swift 协议(Protocol)和扩展(Extension)

本文来自于疯子们的kai'yua 使用protocol来声明一个协议。 类,枚举,结构体都可以适用协议。 实验:写一个遵守这个协议的枚举. 注意使用关键词mutating在声明简单结构体(simpleStructure)来标记修改结构体的方法。简单类(simpleClass)的声明不需要其任何方法标记为改变的,因为类方法总是修改类。 使用扩展(extension)给现有的类型

habout632的专栏 2813

手把手教你用ET-BERT预训练模型搞定加密流量分类(附完整代码)

本文详细介绍了如何使用ET-BERT预训练模型实现加密流量分类,包括环境配置、数据预处理、模型微调及优化策略。通过实战代码示例,帮助开发者快速掌握这一技术,提升网络安全领域的加密流量分析能力。

weixin_29166013的博客 493

iOS基础03—category & extension & protocol

iOS基础03—category &amp; extension &amp; protocol Category(分类) 先来一波代码看看 category @interface Person : NSObject - (void)printName; @end @interface Person (category) - (void)printName; + (id)shareMan...

u012297622的博客 252

使用C#和ASP.NET创建登录页面

在Visual Studio中,右键单击项目,选择"添加",然后选择"新建项"。在对话框中选择"Web",然后选择"Web 窗体"。在Visual Studio中,右键单击项目,选择"添加",然后选择"新建项"。在Visual Studio中,选择"新建项目",然后选择"ASP.NET Web应用程序"。在上面的代码中,我们创建了一个简单的用户界面,包含一个用户名输入框、一个密码输入框和一个登录按钮。在上面的代码中,我们创建了一个简单的用户界面,包含一个用户名输入框、一个密码输入框和一个登录按钮。

TzData的博客 763

2024-江苏科技大学-模拟-动态接触角,模拟液滴撞击,comsol软件模拟。

相反,其对液滴粘度和平衡接触角的变化基本不敏感。重力势能的影响显著受过程参数调节,随着液滴直径和密度的增加而增加,而随着初始液滴速度和表面张力系数的增加而减小。通过考虑形状因子和粘度修正因子,可以准确定义表面能和粘性耗散能,使得所提出的半经验修正勺状模型表现出良好的性能,在所有65个研究案例中,液滴最大铺展长度因子(βmax)和中心厚度(h)的相对误差基本分别落在5%和10%的区间内。重力势能的影响受过程参数显著调节,随液滴直径和密度的增大而增大,随液滴初始速度和表面张力系数的增大而减小。

qq_15963745的博客 512

swift3新路程(10)协议protocol和扩展extension

声明的关键字就是protocol 我们看一个官方例子 protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust() } 枚举、结构体和类都可以使用协议 类使用协议 class SimpleClass: ExampleProtocol { var

AppleEngineer 2181

Supreme小程序自动化抢购终端——源码架构与执行流程全解析

本系统是一套基于开发的桌面端小程序自动化抢购终端。把只有开发者能跑的脚本,包装成普通用户也能操作的桌面工具。参数自动捕获 → 商品多关键词检索 → sku/尺码/库存映射 → 多商品任务队列 → 定时/立即抢购 → 订单创建 → 支付参数拉取 → 本地服务生成支付链接 → 手机微信扫码付款这套 Supreme 抢购终端,表面上看是一个"下单工具"。但从工程角度审视,它已经具备了一个小型桌面自动化系统GUI 层:CustomTkinter 现代化界面,线程安全业务层:多商品队列、定时调度、任务编排。

猫敷雪 203

Swift:Extension和Protocol

本人录制技术视频地址:https://edu.youkuaiyun.com/lecturer/1899 欢迎观看。一、Swift中的扩展功能(Extension)可以动态给类增加功能,类似于Javascript中的prototype;而在objective-c中,是通过runtime来实现动态调用或者添加功能的。定义方式如下:extension SomeType { }1. 单位转换extension Do...

秋恨雪 2539

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

category、extension、protocol

分类(category) ① category只能添加“方法”,不能添加成员变量。 ② 分类中可以访问原来类中的成员变量,但是只能访问@protect和@public属性。 ③ 添加方法加上前缀,添加方法会覆盖父类的同名方法,可以防止意外覆盖,也防止被别人覆盖。 ④ 分类中添加的成员变量,要通过getter、setter方法进行添加。类扩展(extension) ① 类扩展的属性和方法都是私有的,...

蜗牛的小房子 281

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

类目category 扩展extension 协议protocol

类的扩展 category种类 类目 定义使用 分类或类目 类的扩展Category 类目或分类  主要作用是给看不见源代码(苹果系统提供的类)的类添加方法        通过Category 添加的方法会成为元类的的一部分 达到扩展类的功能 通过类目给数组NSArray添加打印方法直接输出中文汉字 #import "NSArray+EasyLog

binghuizi199293的博客 531

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

iOS组件化方案的几种实现

最近研究了一下项目的组件化,把casa、bang、limboy的有关组件化的博客看了一遍,学到了不少东西,对目前业界的组件化方案有了一定的了解。这些高质量的博客大致讨论了组件化的三种方案:url-block、protocol-class(和url-controller类似)、target-action,以及应用这三种组件化方案的时机、步骤、利弊等等。

KelvinFlying的专栏 5806

iOS:Protocol详解

目录 一,作用 二,基本使用 三,特点 四,应用场景 五,系统协议 六,底层代码 一,作用 1,公开方法一般都放在.h文件中,如果想隐藏实现细节,可以把这些方法放到协议中,再让该类遵守此协议(一个协议对应一个类) 2,将一些公共方法抽取出来封装成协议,任何类想拥有这些方法,只需遵守此协议即可(一个协议对应多个类) 问题:公共方法为什么不放在父类中? 答:下图中D类跟E类的公共方法可以放在父类B中,但D类跟G类的公共方法放在父类的父类A中显然是不合适的,这时协议就能很优雅的解决 ..

小天空的博客 2169

Objective C基础(四)---Category、Extension、Protocol

Category、Extension、Protocol是oc中比较特色的技术。Category类目: Category类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的细节。已存在的类包括框架类库中的类和自己创建的类。任何oc中的封装类都可以使用Category类目进行功能扩展。我们随便找一些介绍类目的资料都会发现,类目和继承类是那么的相似,类目相对于子类继承来说并没有节

雨石轩的专栏 827

dubbo源码阅读——Extension扩展机制

dubbo不仅功能强大,扩展性也非常强,在关键的位置,dubbo都留有扩展接口,比如:协议(Protocol)、集群策略(Cluster)、代理工厂(ProxyFactory)、序列化方式(Serialization)、线程池(ThreadPool)、负载均衡(LoadBalance)等等。每一种扩展都有多种实现,采用策略模式把实现写在/META-INF/dubbo/internal中,然后通过E...

xinfei0803的专栏 2284

Xcode升级到Xcode15.1或15.2之后,无法新建Category和Extension文件,如何解决?

Xcode升级到15.1或15.2之后,无法新建Category和Extension文件,并且Xcode不报任何错误。

我叫柱子哥 1910

【iOS】Category、Extension和关联对象

类型的 对象方法列表结构体类型的 类方法列表结构体类型的 协议列表结构体类型的 属性列表结构体结构体中并不包含类型,也就是不包含成员变量结构体首先分类加载分为两种情况:非懒加载分类和懒加载分类,所以分类就有两条加载流程。进入,执行,在中调用了,再到中调用了–>–>–>此时的状态是: 分类对应的主类都还没有实现(没有被初始化),我们只是调用了中的分支将分类和主类关联并将分类加载进了内存。执行完之后,我们回到方法获取类和分类的load方法,在其中调用了。

m0_63852285的博客 2255

iOS 组件化

一、为什么需要组件化 随着公司业务的不断发展,项目的功能越来越复杂,各个业务代码耦合越来越多,代码量急剧增加,传统的 MVC 或者 MVVM 架构已经无法高效的管理工程代码,因此需要用一种技术来更好地管理工程,而组件化是一种能够解决代码耦合的技术。项目经过组件化的拆分,不仅可以解决代码耦合的问题,还可以增强代码的复用性,工程的易管理性等。 组件化的优势 有利于代码模块的封装和复用。 对不同的业务模块可以进行物理隔离(通过git私有 仓库权限控制),进一步提升代码的稳定性和安全性。 项目整体结构层次分明,便

xiaoxiaobukuang的专栏 2804

iOS开发之OC篇(12)—— Category(分类)、Extension(扩展)

一、分类Category这里称分类(另说类别、类目)。 分类的作用:扩展已有类(包括系统类)的功能。 1、继承(Inherit) VS 分类(Category) 2、给分类添加方法 3、给分类添加属性 二、扩展

看影成痴 1191

【iOS】协议与分类

OC语言中的协议类似于java语言中的接口,OC不支持多重继承,因此我们把某个类应该实习那的一系列方法定义在其协议里。协议最常见的是委托模式,分类也是OC语言的一项重要有v眼特性。利用好分类机制,我们无需继承子类即可为当前类添加方法。而在其他编程语言中,需要继承子类来实现。

weixin_61196797的博客 751

ios之浅谈分类、类的扩展、协议以及协议的使用

一、分类 1.在不改变原有类的基础上为类添加方法,只能添加方法,由此延伸到继承,而继承呢不但可以扩充方法,还可以添加属性。 2.分类可以有多个,也就是一个类可以有多个分类。 3.分类的用途: (1)可以为系统的类添加我们想要的方法,比如,我们在写程序的用到tableView,有时候没有网络或者服务器停止时,界面刷新不出来,我们需要展位图提醒用户,这时我们可以用类别的方法,为UITableV

奔跑的蜗牛 1364
上一篇: iOS杂记——static关键字作用
下一篇: 《Objective-C高级编程 iOS与OS X多线程和内存管理》学习笔记——第一章自动引用计数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值