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作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能...
  • LIN1986LIN
  • LIN1986LIN
  • 2014年03月10日 19:10
  • 932

扩展机制category与associative

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能...
  • BSPLover
  • BSPLover
  • 2012年09月16日 11:35
  • 923

iOS 扩展机制category与associative

在写新浪微博的时候,要处理点击微博图片放大的问题,这里我采用的处理是使用category和associative扩展机制为UIImageview扩展添加一个方法和一个属性,这个方法是处理点击图片放大,...
  • Crayon_DyS
  • Crayon_DyS
  • 2013年06月18日 20:09
  • 5140

iOS 扩展机制category与associative

在写新浪微博的时候,要处理点击微博图片放大的问题,这里我采用的处理是使用category和associative扩展机制为UIImageview扩展添加一个方法和一个属性,这个方法是处理点击图片放大,...
  • lusonglin121
  • lusonglin121
  • 2013年09月10日 15:57
  • 805

iOS扩展机制 - associative

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能...
  • cactusz
  • cactusz
  • 2017年07月06日 16:22
  • 34

iOS 扩展机制 Associative

1. Associative的概念* objective_c有两个扩展机制:category和associative。我们可以通过category来扩展方法,但是它有个很大的局限性,不能扩展属性...
  • qq_31337641
  • qq_31337641
  • 2015年11月10日 17:02
  • 231

OC中的类别Category-协议Protocol-扩展Extension

类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中。通常只在类别中定义方法。  类别,接口部分的定义,通常该文件命名为已有"类...
  • hanangellove
  • hanangellove
  • 2015年01月13日 23:11
  • 4187

IOS 分类(category)、扩展(Extension)和继承(inheritance)的区别?

前言        一直分不清分类和扩展有什么区别?!所以本着二杆子的精神,一定要搞清楚。iOS中category是对...
  • benbenhai1999
  • benbenhai1999
  • 2016年05月26日 09:53
  • 2735

Associative机制使用场景[objective-c有两个扩展机制:category扩展方法和associative扩展属性]

原创文章,转载请注明出处:http://blog.sina.com.cn/s/blog_60342e330101tcz1.html 1.    概念 objective-c有两...
  • a1484
  • a1484
  • 2015年07月22日 18:24
  • 343

谈谈iOS中Categories(分类)、Extensions(类扩展)和继承的区别

最近乱点了篇博客,点击打开链接 博主总结得乱七八糟,虽然这知识点太过久远,还是我来谈谈iOS中Categories(分类)、Extensions(类扩展)和继承的区别 吧。 简单的讲,通过Categ...
  • jaccty
  • jaccty
  • 2015年08月05日 14:08
  • 741
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS中扩展机制Category和associative
举报原因:
原因补充:

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