在ios开发中,有时候会遇到以下的问题,需要在一个类中添加自己的一些属性和方法。一般的做法是重写一个类来继承它,但是有时候就只是需要添加一些简单的属性和方法,那么这样做就显得过于麻烦,其实在IOS中还有更简单的方法,那就是Category.

用一个例子来简单介绍以下Category的用法。

@interface UIImageView (CategoryName)

只需要在interface中加上category的名称。

添加自定义的方法(Category)

我们来给UIImageView添加一个自定义的speak方法

@interface UIImageView (image)

- (void)speak:(NSString *)words;

@end

接下来就是对这个方法的实现

@implementation UIImageView (image)

- (void)speak:(NSString *)words
{
NSLog(@"%@",words);
}
@end

一旦实现了该方法,那么就可以在UIImageView中直接调用speak方法

添加自定义的属性(associative)

添加自定义属性需要用到associative

@interface UIImageView (title)

@property (nonatomic, strong) NSString *title;

@end

但是仅仅这样是没有办法使用的,还需要导入包#import <objc/runtime.h>

用到了oc的运行时

@implementation UIImageView (title)

static void * MyKey = (void *)@"MyKey";

- (NSString *)title
{
return objc_getAssociatedObject(self, MyKey);
} - (void) setTitle:(NSString *)title
{
objc_setAssociatedObject(self, MyKey, title, OBJC_ASSOCIATION_COPY_NONATOMIC);
} @end

然后实现该属性的get和set方法

Category的局限性

主要有两方面局限性:

(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。可以通过associative来解决

(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。这个类似于方法的重载,但是这里是直接覆盖了原方法

类别的作用

类别主要有3个作用:

(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(因为框架类没有源码,不能修改)。

(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告

(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。

associative

associative是在运行时动态的添加属性,一般用的比较少。但是还是需要熟悉一下。

IOS中扩展机制Category和associative的更多相关文章

  1. iOS学习系列 - 扩展机制category与associative

    iOS学习系列 - 扩展机制category与associative category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 ...

  2. iOS中OC给Category加入属性

    引: 非常多人知道能够用Category给已有的类加入一些新方法,可是不同于swift中的extension,Objective-C中的Category(类别)是不支持直接加入属性的.那假设就是须要加 ...

  3. iOS UIImage扩展方法(category):放大、旋转、合并UIImage、增加渐变层、添加阴影、调节透明度、保存到相册

    一有用的 UIImage 扩展,支持(等比例)放大和旋转可在许多 App 中使用. UIImage-Extensions.h #import <Foundation/Foundation.h&g ...

  4. ios中的category与extension

    http://blog.csdn.net/haishu_zheng/article/details/12873151   category和extension用来做类扩展的,可以对现有类扩展功能或者修 ...

  5. Dubbo中SPI扩展机制解析

    dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源. dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name, ...

  6. IOS中的沙盒机制

    IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件 ...

  7. iOS中消息的传递机制

    本文中,会经常提及接收者[recipient]和发送者[sender].在消息传递机制中具体是什么意思,我们可以通过一个示例来解释:一个table view是发送者,而它的delegate就是接收者. ...

  8. Spring中自定义Schema扩展机制

    一.前言 Spring 为基于 XML 构建的应用提供了一种扩展机制,用于定义和配置 Bean. 它允许使用者编写自定义的 XML bean 解析器,并将解析器本身以及最终定义的 Bean 集成到 S ...

  9. Spring Cloud 中自定义外部化扩展机制原理及实战

    Spring Cloud针对Environment的属性源功能做了增强, 在spring-cloud-contenxt这个包中,提供了PropertySourceLocator接口,用来实现属性文件加 ...

随机推荐

  1. Uva1343-The Rotation Game-IDA*算法

    原题https://uva.onlinejudge.org/external/13/1343.pdf 题意: 有个#字型的棋盘,2行2列,一共24个格. 如图:每个格子是1或2或3,一共8个1,8个2 ...

  2. ssh技巧

    1. 打通ssh key的简单方法: ssh-copyid 192.168.1.1 2.使用ssh 将Linux主机变成http代理服务器 ssh -NfD 192.168.22.1:10080 12 ...

  3. PHPExcel内存泄漏问题

    使用 PHPExcel 来生成 excel 文档是比较消耗内存的,有时候可能会需要通过一个循环来把大数据切分成若干个小的 excel 文档保存来避免内存耗尽. 然而 PHPExcel 存在 circu ...

  4. .NET中的程序集(Assembly)

    在.NET 中,新引入了一个程序集的概念,就是指经由编译器编译得到的,供CLR进一步编译执行的那个中间产物,在WINDOWS系统中,它一般表现为.dll,或者是.exe的格式,但是要注意,它们跟普通意 ...

  5. 安卓ListView操作的两种方法

    举例做一个微信的中间部分(好友消息等信息通知) 第一种:BaseAdapter() package com.example.wx; import java.util.ArrayList;import ...

  6. cocos2d-x 关于tilemap滚动时黑线闪动的问题

    改动抗锯齿这个全然没用. 解决问题的方法是开启CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL=1.不是在自己的project中开启,而是改动libcocos2dx库来解决 wa ...

  7. hdu 3642 Get The Treasury(扫描线)

    pid=3642" style="">题目链接:hdu 3642 Get The Treasury 题目大意:三维坐标系,给定若干的长方体,问说有多少位置被覆盖3次 ...

  8. lnux内核的malloc实现(Oracle的cache buffer影子)

    lnux内核的malloc实现(Oracle的cache buffer影子) 本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/artic ...

  9. Android中强大的Matrix操作

    简介: Matrix翻译字面意思时矩阵,在Android的API中提供了两种Matrix,分别是android.graphics.Matrix 和 android.opengl.Matrix . 后者 ...

  10. 数据库 ORM框架 ORMLite

    几个ORM框架的比较 先介绍一下ORM的概念,以前也一直听说,不过没详细了解啥意思.其全称叫做对象关系映射(Object Relation Mapping),是一种程序设计技术,用于实现面向对象编程语 ...