Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考
总结:继承、分类(Category、extension)、协议(protocol)
读写属性: (readwrite/readonly)
setter语意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各参数意义如下:
readwrite: 产生setter\getter方法
readonly: 只产生简单的getter,没有setter。
assign: 默认类型,setter方法直接赋值,而不进行retain操作
retain: setter方法对参数进行release旧值,再retain新值。
copy: setter方法进行Copy操作,与retain一样
nonatomic: 禁止多线程,变量保护,提高性能
二、分类:有两种形式
第一种:类别(命名的分类) Category 它有.h和.m文件 (只能新添加方法)
第二种:类扩展(延展)(未命名的分类) extension 它只有.h文件 (可以添加方法和实例变量)
(1)特点:分类多用于没有源代码的类,分类可以提供类需要的所有方法,它扩展类的功能,一般分模块进行。当然,它在不修改原有类的基础上添加新的方法,正是因为它具有将一个庞大的类可以分模块实现的优点,才使得做项目时更有利于团队的合作。它在扩展现有类的方法时,不需要访问源码,也不需要创建子类,而且也不必实现分类中的所有方法,这是它与一般接口和协议的区别之处。当分类中的方法与类方法同名时,它会覆盖类中的方法,那么类的同名方法永远就执行不到。
(2) 过程:<1>类别Category的使用时,它有.h声明文件和.m实现文件,所有新添加的方法都放在.h文件中进行声明,然后再.m文件中根据自己的需要选择性的实现这些方法。切记,它只能新添加方法,而且都是公有的;<2>类扩展extension使用时,它只有.h声明文件,所有新添加的方法和实例变量都只能在类中分别进行实现和初始化。切记,它新添加的方法和实例变量都是类私有的,只能在本类中进行访问,访问方式为[self method],不然即使在其他的任何地方有这个类的对象也不能访问到。一般地,类扩展不单独作为一个文件,而是直接把它写入类的实现文件中实现即可。
(3)格式:头文件名 类名+分类名.h 例如:NSString+Math.h
<1>Category
@interface 类名(分类名) =========> .h声明文件
{
新添加的方法method;
}
@end
@implementation 类名 ==========>.m实现文件
{
实现新添加的方法method;
}
@end
<2> extension
@interface 类名() ============> .h声明文件
{
先添加的实例变量property;
}
//@property(参数1,参数2) 类型名 变量名;
新添加的方法method;
@end
(4)提醒:在类别中只能添加方法,方法都是公有的;在类扩展中,既可以添加方法,也可以添加实例变量,但是添加的内容都是类私有的,只能在类的内部访问。
三、协议(protocol)
(1)特点:协议多用在许多类同时使用相同的方法而且这些代码重复性很大的情况下,它会把这些重复的代码提炼出来放在一个协议里,供大家使用。它确实有些类似于java中的接口和C++中的纯虚函数的抽象类,它提供协议的规则,使用者只有遵从协议的规则才能使用它所提供的方法。当然这些方法在协议中它只是帮助进行了声明,并没有任何的实现。当使用者遵从这个协议并使用它的方法时,如果在类声明文件中方法都是默认的或者是@required时,那么在类实现文件中必须全部地实现这些方法。如果是@optional标记的,使用者可以选择性的实现,视情况而定。
(2)过程:它只有.h声明文件,它既可以作为一个单独的文件进行声明所提供的方法,也可以直接放在类声明文件中进行声明,一般采用后者进行声明。它的方法声明时有默认、@required、@optional三种情况。当使用前面两种时,在类实现文件中必须全部地实现这些方法。如果是@optional标记的,使用者可以选择性的实现,视情况而定。当它的方法没有@optional时,那么它就类似于接口中的abstract整个类是抽象的,是必须全部实现所有的方法的。
(3)格式: @protocol 协议名:<父类协议名> =======>放在类的.h文件中或者在自己的单独创建的.h文件中
{
method1;//默认的,类实现文件中必须要实现这个方法
@required
method2; //需求的,类实现文件中必须要实现这个方法
@optional
method3;//可选择的,使用者可以选择性的实现
}
@end
(4)应用:利用协议可以实现代理模式。也就是给类寻找委托人,帮助类完成一些功能,而类不用自己亲自去做。这种代理模式使得代码的灵活性提高,也降低了耦合性,不必向继承那样,因为父类和子类的耦合性太强,父类一变化,子类就也得跟着变化,太过麻烦。协议要求,不管使用者是谁,阿猫阿狗都行,只要遵从规则,就可以用协议的方法替类去完成委托的任务。类似于老板与秘书的关系:老板出差时,秘书给老板订票、订房;老板开会时,秘书就负责通知所有要开会的人。。。
(5)说明:协议也是可以继承的,就如所有类的根类是NSObject一样,协议的根类协议也是NSprotocol;满足协议规则的类,在类的后面跟上<协议名字>,例如:@interface Student:Person<协议名>
Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考的更多相关文章
- 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...
- OC基础--分类(category) 和 协议(protocol)
OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低, ...
- 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别
1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...
- 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol
关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...
- OC中分类(Category)和扩展(Extension)
1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...
- Objective-C-----协议protocol,代码块block,分类category
概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,本文将重点介绍objective-C中一些常用的语法特性. 当然这些内容虽然和其他高级语言 ...
- iOS中 分类(category)与扩展(Extension)的区别?
1.分类(category)的作用 (1).作用:可以在不修改原来类的基础上,为一个类扩展方法.(2).最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? (1).分类中只能添加“方法”,不 ...
- Objective-C中的协议(Protocol)和类别(Category)
1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的 ...
- Objective-C分类 (category)和扩展(Extension)
1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...
随机推荐
- 20169211《Linux内核原理与分析》 第十周作业
一.Linux内核之进程地址空间学习总结 Linux内核除了要管理物理内存还需要管理虚拟内存.用户进程的地址空间就是虚拟内存的一部分.每个用户进程都独有一个地址空间.由于是虚拟化的内存,所以从每个进程 ...
- OpenCV 基础笔记
本文大部分内容来源于入门者的Python快速教程 - 番外篇之Python-OpenCV 本篇将介绍和深度学习数据处理阶段最相关的基础使用,并完成4个有趣实用的小例子: 延时摄影小程序 视频中截屏采样 ...
- MySQL服务器 IO 100%的案例分析
[问题] 有台MySQL 5.6.21的数据库实例以写入为主,IO %util接近100% 写入IOPS很高 [分析过程] 1.通过iotop工具可以看到当前IO消耗最高的mysql线程 2.查看线程 ...
- 不改源代码,修改服务器配置,解决全局Get中文乱码问题
- @getMapping和@postMapping,@RestController
@RequestMapping 和 @GetMapping @PostMapping 区别 @GetMapping是一个组合注解,是@RequestMapping(method = Reques ...
- 图解在Eclipse中如何上传项目到svn
方法/步骤 1.在Eclipse中新建project,如下图所示: 2.右键project --> team --> share project,如下图所示: 3.选择repository ...
- Django中使用locals()函数的技巧
对 current_datetime 的一次赋值操作: def current_datetime(request): now = datetime.datetime.now() return rend ...
- 【贪心】Codeforces Round #480 (Div. 2) C. Posterized
题意:让你对[0,255]这个序列任意划分成一些不重叠的子段,每个子段的大小不超过K.给你n个不超过255的数,让你将每个数替换成它所在子段的任意一个元素,使得最终这个n个数的序列的字典序最小. p[ ...
- 协议栈中使用crc校验函数
CRC校验介绍:循环冗余校验码,原理是多项式除法 ZigBee协议栈:能够使zigbee节点相互之间组网,数据传输,数据获取,数据显示 思路以及步骤: 1.因为IAR的程序是用c写的,所以上网查找如何 ...
- php curl 发送get和post请求示例
<?php final class HttpClient { const TIME_OUT = 10; static function get($url) { $ch = curl_init() ...