iOS Developer

iOS利用runtime给分类添加属性

2017-07-05  本文已影响52人  李二侠

在项目开发中,有时候会觉得某些类属性不够用或者想给一些类添加属性,例如给UIImageView添加一个name的属性,用来给UIImageView取名字(这里只是举例子,实际情况根据自己需要添加)。
一般情况下我们可以通过写一个类继承UIImageView,然后给这个类添加一个name属性既可,但是如果只是多添加一个属性就重新写一个类的话,总感觉略显麻烦,毕竟有时候还是习惯用系统的UIImageView。这个时候我们就可以利用runtime在UIImageView的分类里面创建了。

1.首先创建一个UIImageView的分类:


屏幕快照 2017-07-05 下午2.36.09.png

2.在.h声明一个name的属性:


屏幕快照 2017-07-05 下午2.39.17.png
如果不在.m文件里用runtime做一些处理,在controller里面直接如下
屏幕快照 2017-07-05 下午2.42.41.png

使用这个name属性的话(ps:使用之前要导入"UIImageView+newProperty.h"),程序会崩溃。

3.为了能够正常使用这个属性,runtime就登场了。在UIImageView+newProperty.m中导入#import <objc/runtime.h>

先声明一个key值,下面会用到

static char * nameKey = "nameKey";
#pragma mark 动态添加新属性,需要手动实现setter和getter方法
/*
 
 id object:一般在分类中创建属性,直接写self即可
 const void *key:给这个属性独一无二的一个key值,一般用创建的key的地址即可或者也可以直接用这个声明的key
 id value:就是你声明的name属性
 objc_AssociationPolicy :点击源文件,里面的几个类型应该都能看的懂吧,根据自己声明的属性进行适当的选择

 objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
 
 */
- (void)setName:(NSString *)name
{
    //将name和其对应key关联起来
    objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name
{
    //根据key值对到对应value
    return objc_getAssociatedObject(self, &nameKey);
}

4.做完这些之后,就可以在需要的地方引用了。
例如:

 UIImageView * imgView = [UIImageView new];
 imgView.name = @"路飞";

这样就可以给UIImageView取名字了,当然实际要根据自己的需要添加

上一篇下一篇

猜你喜欢

热点阅读