关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
框架
使用关联,咱们能够不用修改类的定义而为其对象增长存储空间。这在咱们没法访问到类的源码的时候或者是考虑到二进制兼容性的时候是很是有用。
关联是基于关键字的,所以,咱们能够为任何对象增长任意多的关联,每一个都使用不一样的关键字便可。关联是能够保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会致使资源不可回收)。函数
建立关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另一个对象进行关联。该函数须要四个参数:源对象,关键字,关联的对象和一个关联策略。固然,此处的关键字和关联策略是须要进一步讨论的。
■ 关键字是一个void类型的指针。每个关联的关键字必须是惟一的。一般都是会采用静态变量来做为关键字。
■ 关联策略代表了相关的对象是经过赋值,保留引用仍是复制的方式进行关联的;还有这种关联是原子的仍是非原子的。这里的关联策略和声明属性时的很相似。这种关联策略是经过使用预先定义好的常量来表示的。atom
//
// UIView+AddProperty.h
// category添加属性
//
// Created by jie on 15/4/13.
// Copyright (c) 2015年 jie. All rights reserved.
//spa
@interface UIView (AddProperty)
@property(nonatomic,copy)NSString *title;
@end .net
//
// UIView+AddProperty.m
// category添加属性
//
// Created by jie on 15/4/13.
// Copyright (c) 2015年 jie. All rights reserved.
//指针
@implementation UIView (AddProperty)
static void MyKey = (void )@"MyKey";对象
-(NSString *)title
{
return objc_getAssociatedObject(self, MyKey);
}继承
-(void)setTitle:(NSString *)title
{
objc_setAssociatedObject(self, MyKey, title, OBJC_ASSOCIATION_COPY);
}
@end生命周期
//
// ViewController.m
// category添加属性
//
// Created by jie on 15/4/13.
// Copyright (c) 2015年 jie. All rights reserved.
//ci
@interface ViewController ()
@end
@implementation ViewController
(void)viewDidLoad {
[super viewDidLoad];
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 150, 100, 100)];
view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];
view.title = @"哈喽 jie category 添加属性";
NSLog(@"%@",view.title);
}
/**
在iOS开发中,有时候会遇到如下的问题,须要在一个类中添加本身的一些属性和方法。
一、通常的作法是重写一个类来继承它,
二、可是有时候就只是须要添加一些简单的属性和方法,那么这样作就显得过于麻烦,其实在iOS中还有更简单的方法,那就是Category.
Category的局限性 主要有两方面局限性: (1)没法向类中添加新的实例变量,类别没有位置容纳实例变量。能够经过associative来解决 (2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具备更高的优先级。类别方法将彻底取代初始方法从而没法再使用初始方法。这个相似于方法的重载,可是这里是直接覆盖了原方法 类别的做用 类别主要有3个做用: (1)能够将类的实现分散到多个不一样文件或多个不一样框架中,方便代码管理。也能够对框架提供类的扩展(由于框架类没有源码,不能修改)。 (2)建立对私有方法的前向引用:若是其余类中的方法未实现,在你访问其余类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(没必要提供方法实现),编译器就不会再产生警告 (3)向对象添加非正式协议:建立一个NSObject的类别称为“建立一个非正式协议”,由于能够做为任何类的委托对象使用。 associative associative是在运行时动态的添加属性,通常用的比较少。可是仍是须要熟悉一下。 */@end