您的位置:首页 > 编程语言 > Go语言

利用运行时关联(runtime)给分类(Category)中的属性存值.

2015-12-20 21:16 549 查看
分类的作用:它可以在不改变原来的类的内容的基础上,为类增加一些方法。

分类使用注意:

(1)在分类中可以增加方法

(2)在分类中不能增加成员变量

(3)在分类中可以添加属性,但是属性不可以保存值,因为分类中没有成员

变量,在分类中不会生成 _变量,不会实现getter和setter方法,需要手动的实现getter和setter方法。

(4)分类中可以重新实现原来类的方法,但是会覆盖掉原来的方法,导致原来

的方法无法使用

(5)方法调用优先级:分类-->原来的类-->父类,若包含有多个分类,则最后

参与编译的分类优先。

为分类添加属性时,属性不能保存值,我们在setter方法中无法把传入的变量

保存起来,那么在调用getter方法时就无法返回传入的变量。

我们可以利用runtime来,解决这个问题。

运行时关联对象:

1.在程序运行的时候,动态的给对象添加属性

objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)

2.在程序运行的时候,,动态获取对象的属性

objc_getAssociatedObject(<#id object#>, <#const void *key#>)

3.移除关联的对象

objc_removeAssociatedObjects(<#id object#>)

运行时关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。

使用关联时,我们可以不用修改类的定义而为其对象增加存储空间。关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可,关联可以保证被关联的对象在关联对象的整个生命周期都是可用的。(在自动垃圾回收环境下也不会导致资源不可回收)

#import
<UIKit/UIKit.h>

@interface UIImageView (url)

@property (nonatomic,copy)NSString *lastUrl;

@end

#import
"UIImageView+url.h"

#import
<objc/runtime.h>

@implementation UIImageView (url)

- (void)setLastUrl:(NSString *)lastUrl{

/*

1.
需要关联的对象 self

2.
需要关联的对象的属性的键值(key)

3.需要关联的对象的属性

4.需要关联的对象的属性的修饰符

*/

//动态的给对象添加属性

objc_setAssociatedObject(self,"key", lastUrl,OBJC_ASSOCIATION_COPY_NONATOMIC);

}

- (NSString *)lastUrl{

/*

1.
需要关联的对象 self

2.
需要关联的对象的属性的键值(key)

*/

//动态的获取对象的属性

return objc_getAssociatedObject(self,"key");

}

-(void)dealloc{

//移除关联对象

objc_removeAssociatedObjects(self);

}

@end

#import
"ViewController.h"

#import
"UIImageView+url.h"

@interfaceViewController()

@property(nonatomic,strong)UIImageView* imageView;

@end

@implementation ViewController

- (UIImageView *)imageView{

if(_imageView==nil){

_imageView = [[UIImageViewalloc]init];

}

return _imageView;

}

- (void)viewDidLoad {

[superviewDidLoad];

self.imageView.lastUrl =@"hello";

NSLog(@"%@",self.imageView.lastUrl);

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: