OC的类别(分类)和拓展
一.分类:
@interface 主类类名(分类类名)
//不可以定义成员属性
@end @implementation 主类类名(分类类名) @end
文件名通常为:主类名+分类名
- 分类中方法的优先级比原来类中的方法高,也就是说,在分类中重写了原来类中的方法,那么分类中的方法会覆盖原来类中的方法
- 分类中只能声明方法,不能添加属性变量,在运行时分类中的方法与主类中的方法没有区别
- 通常来讲,分类定义在.h文件中,但也可以定义.m文件中,此时分类的方法就变成私有方法
XYZPopViewController+CatController.h文件
@interfaceXYZPopViewController (CatController)
- (void)test;
@end XYZPopViewController+CatController.m文件
@implementationXYZPopViewController (CatController)
- (void)test {
NSLog(@"测试一下XYZPopViewController的分类");
}
@end
5.虽然不能再类别中定义成员属性,但是也可以让它支持添加属性和成员变量
Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
//NSObject+IndieBandName.h
@interface NSObject (IndieBandName)
@property (nonatomic, strong) NSString *indieBandName;
@end
上面是头文件声明,下面的实现的.m文件 1 // NSObject+IndieBandName.m 2 #import "NSObject+Extension.h"
#import <objc/runtime.h>
static const void *IndieBandNameKey = &IndieBandNameKey;
@implementation NSObject (IndieBandName)
@dynamic indieBandName;
- (NSString *)indieBandName {
//如果属性值是非id类型,可以通过属性值先构造OC的id对象,在通过对象获取非id类型属性
return objc_getAssociatedObject(self, IndieBandNameKey);
} - (void)setIndieBandName:(NSString *)indieBandName{
//如果属性值是非id类型,可以通过属性值先构造OC的id对象,在通过对象获取非id类型属性
objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
二、扩展
- 扩展中可以声明实例变量,可以声明属性
- 因为扩展通常定义在主类的.m文件中,所以扩展声明的方法和属性通常是私有的
XYZPopViewController_ExViewController.h文件
#import"XYZPopViewController.h" @interface XYZPopViewController()
@property(nonatomic,strong)NSString*stringOfEx;
- (void)testEx;
@end
XYZPopViewController.m文件
#import"XYZPopViewController.h" @interface XYZPopViewController()
@property(nonatomic,strong)NSString*stringOfEx;
- (void)testEx;
@end
在主类的.m文件中实现扩展定的方法
@implementation XYZPopViewController
- (void)testEx {
self.stringOfEx=@"给扩展里面定义的属性字符串赋值";
NSLog(@"定义的属性String是:%@",self.stringOfEx);
}
@end
OC的类别(分类)和拓展的更多相关文章
- 如何在swift中实现oc中的分类
在oc中为了增强已有类的功能,我们经常使用分类.使用分类,我们可以在不破坏原有类的结构的前提下,对原有类进行模块化的扩展. 但是在swift中没有分类这种写法了.相对应的是swift中只有扩展(Ext ...
- 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol
关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...
- [DeeplearningAI笔记]Multi-class classification多类别分类Softmax regression_02_3.8-3.9
Multi-class classification多类别分类 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.8 Softmax regression 原有课程我们主要介绍的是二分分类( ...
- OC 类别(分类)Categroy
Categroy类别,又称为扩展类,在类的原基础上扩展方法,且不可添加变量,如果扩展的方法与原始类中的方法相同,则会隐藏原始方法,且不可在扩展方法中通过super调用原始方法,这里与继承不同. 定义: ...
- [OC笔记] Category分类之见解
用过别的语言做过开发的同学都知道,如果你想扩充一个类,就应该去继承这个类.但是OC里面有更好的方法,那就是分类. 那什么是分类呢?就是在不改变原先类,我们可以在其中添加咱们自定义的方法,这样和同事合作 ...
- OC中类别、扩展、协议与委托
一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...
- OC中类别、扩展、协议与托付
类别(category)--通过使用类别,我们能够动态地为现有的类加入新方法.并且能够将类定义模块化地分不到多个相关文件里.通常仅仅在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有&qu ...
- 吴恩达机器学习笔记18-多类别分类:一对多(Multiclass Classification_ One-vs-all)
对于之前的一个,二元分类问题,我们的数据看起来可能是像这样: 对于一个多类分类问题,我们的数据集或许看起来像这样: 我用3 种不同的符号来代表3 个类别,问题就是给出3 个类型的数据集,我们如何得到一 ...
- OC对象给分类加入属性
OC对象中不能给分类加入属性.可是在实际开发中.常常为了更好的性能须要给分类加入属性,那么 加入的属性不能有默认的成员变量.须要我们自己实现set和get方法,要用到执行时 例如以下: #import ...
随机推荐
- 如何在github下载开源项目到本地(Coding iOS 客户端为例)
一.前言 以 Coding iOS 客户端 为例讲解如何在github下载开源项目到本地 github地址:https://github.com/Coding/Coding-iOS 二.分析 根据项目 ...
- 单位圆盘的全纯自同构群Aut B(0,1)
利用Schwarz引理可以求出单位圆盘$B(0,1)$的全纯自同构群${\rm Aut}B(0,1)$. 任取$a\in B(0,1)$,记$$\varphi_{a}(z)=\frac{a-z}{1- ...
- Mac系统 安装SVN
- Matlab的部分文件操作
Author:Maddock Date:2015-01-20 判断文件是否存在 infilename = [str,'\lena.jpg']; sgc_exist = exist(infilename ...
- bin/sh^M: bad interpreter: No such file or directory解决
问题:bin/sh^M: bad interpreter: No such file or directory 原因:.sh脚本在windows系统下用记事本文件编写的.不同系统的编码格式引起的. 解 ...
- 打造自己的php动态连接库文件
http://blog.163.com/weibin_li/blog/static/1901464172012325115517181/
- 缓存依赖中cachedependency对象
缓存依赖主要提供以下功能:1.SQL 缓存依赖项可用于应用程序缓存和页输出缓存.2.可在 SQL Server 7.0 及更高版本中使用 SQL 缓存依赖项.3.可以在网络园(一台服务器上存在多个处理 ...
- Linux 计划任务
实例: 每5分钟定时访问一个url # crontab -e #*/5 * * * * /usr/bin/curl http://aa.com:8080/tools/sitemap.php >& ...
- mysql 导入导出csv
导出: select RESOURCE_ID_INT,RESOURCE_ID_CHAR,RESOURCE_TITLE from t_resource_info_wb into outfile '/us ...
- 基于淘宝弹性布局方案lib-flexible的问题研究
上篇文章<淘宝弹性布局方案lib-flexible实践>结合一个简单的实例,说明了lib-flexible的基本用法,但是lib-flexible的这种适配方式在适配的时候会修改viewp ...