在项目开发中,有时候会觉得某些类属性不够用或者想给一些类添加属性,例如给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取名字了,当然实际要根据自己的需要添加
网友评论