关于iOS Category实现添加属性及成员变量
2017-02-15 17:34
381 查看
iOS分类:
很多说法是只能添加方法,而不能添加成员变量或属性。
有些人可能知道,这种说法是不严谨的,并不是绝对不能添加变量。
解释如下:
我们知道在一个类中用@property声明属性,编译器会自动帮我们生成
因此结论是:我们可以用@property声明属性,编译会通过,但run之后就会崩溃。
问题来了。。
既然报错的根本原因是使用了系统没有生成的
其实是可以的。由于OC是动态语言,方法真正的实现是通过
举例如下:
分类.h
分类.m
重点就是两个runtime实现方法,如果不写这个,只要你申明了属性,运行肯定会报错;如果加了这两个方法,就能运行通过了,而且,我们在其他地方也能正常使用了
很多说法是只能添加方法,而不能添加成员变量或属性。
有些人可能知道,这种说法是不严谨的,并不是绝对不能添加变量。
解释如下:
我们知道在一个类中用@property声明属性,编译器会自动帮我们生成
_成员变量和
setter/getter,但分类的指针结构体中,根本没有属性列表。所以在分类中用@property声明属性,既无法生成
_成员变量也无法生成
setter/getter。
因此结论是:我们可以用@property声明属性,编译会通过,但run之后就会崩溃。
问题来了。。
既然报错的根本原因是使用了系统没有生成的
setter/getter方法,可不可以在手动添加
setter/getter来避免崩溃,完成调用呢?
其实是可以的。由于OC是动态语言,方法真正的实现是通过
runtime完成的,虽然系统不给我们生成
setter/getter,但我们可以通过
runtime手动添加
setter/getter方法。那具体怎么实现呢?
举例如下:
分类.h
#import "Programmer.h" @interface Programmer (Category) @property(nonatomic,copy) NSString *nameWithSetterGetter; //设置setter/getter方法的属性 - (void) programCategoryMethod; //分类方法 @end
分类.m
#import "Programmer+Category.h" #import <objc/runtime.h> static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey"; @implementation Programmer (Category) - (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter { objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY); } - (NSString *)nameWithSetterGetter { return objc_getAssociatedObject(self, &nameWithSetterGetterKey); } - (void)programCategoryMethod { NSLog(@"实现分类方法"); } @end
重点就是两个runtime实现方法,如果不写这个,只要你申明了属性,运行肯定会报错;如果加了这两个方法,就能运行通过了,而且,我们在其他地方也能正常使用了
Programmer *programmer = [[Programmer alloc]init]; //通过runtime实现了setter/getter programmer.nameWithSetterGetter = @"有setter/getter"; //调用setter,成功 NSLog(@"%@",programmer.nameWithSetterGetter); //调用getter,成功
相关文章推荐
- iOS设置TextField的placeholder的颜色,位置,字体,光标颜色
- 关于iOS 类扩展Extension的进一步深层理解
- IOS:Warning: Attempt to dismiss from view controller <xxxxxxxxxController: 0x15bd67f0> while a prese
- iOS 推送全解析,你不可不知的所有 Tips!
- iOS 获取当前正在显示的ViewController
- iOS 对象之间的通信方式(delegate、block、NSNotification、kvc、kvo)总结
- iOS Universal Links(通用链接)
- iOS开发经验总结3
- iOS开发经验总结2
- iOS开发经验总结1
- ios 开发 ping
- iOS设计模式-策略模式
- iOS导航栏的隐藏方式
- 四,iOS 界面中的摇一摇功能实现
- iOS 开发中的几种设计模式
- 关于iphone accessory的理解
- IOS开发NSBundle对象使用详解
- iOS学习-删除storyboard中viewController黑屏问题
- ios常见加密解密方法(RSA、DES 、AES、MD5)
- iOS开发 开发者账户介绍