IOS中扩展机制Category和associative

转载 2016年06月01日 15:29:36

在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

@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

在写新浪微博的时候,要处理点击微博图片放大的问题,这里我采用的处理是使用category和associative扩展机制为UIImageview扩展添加一个方法和一个属性,这个方法是处理点击图片放大,...

iOS学习之-扩展机制category与associative

标签(空格分隔): iOS category associativeOC的运行时提供了两种机制来对已有的类进行扩展: category 对原有的方法进行扩展 associative 对原有的属性进行扩...

iOS扩展机制category与associative理解

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能...

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

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能...

扩展机制category与associative

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能...

iOS 扩展机制 Associative

1. Associative的概念* objective_c有两个扩展机制:category和associative。我们可以通过category来扩展方法,但是它有个很大的局限性,不能扩展属性...

iOS runtime 机制 通过别扩展category给一个类添加属性

http://www.cnblogs.com/tangbinblog/p/3944316.html category使用 objc_setAssociatedObject/objc_getAssoc...
  • jeffasd
  • jeffasd
  • 2016年04月13日 22:54
  • 699

【iOS沉思录】OC中的类扩展机制:Category类别和Extension类扩展

OC中类别(Category)是什么? Category类别是Objective-C语言中提供的一个灵活的类扩展机制。类别用于在不获悉、不改变原来代码的情况下往一个已经存在的类中添加新的方法,只需要知...
  • cordova
  • cordova
  • 2017年01月19日 23:38
  • 887

iOS运行时初探-使用运行时机制向Category中添加属性

前言了解OC的都应该知道,在一般情况下,我们是不能向Category中添加属性的,只能添加方法,但有些情况向,我们确实需要向Category中添加属性,而且很多系统的API也有一些在Category添...

Associative机制使用场景

Associative机制使用场景 转载出处:http://blog.sina.com.cn/s/blog_60342e330101tcz1.html 1.    概念 obje...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS中扩展机制Category和associative
举报原因:
原因补充:

(最多只允许输入30个字)