利用运行时关联(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
分类使用注意:
(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
相关文章推荐
- 使用boost的库链接问题generic_category()
- ubuntu下安裝sogou拼音
- UBUNTU14.04安装sogou输入法
- Resource Governor 控制 Memory 和 CPU 的使用
- 永久开启完整版Google Play
- 30天30个Golang程序学习(一):格式化输出
- 10 Rules of Good and Bad Studying By Barbara Oakley
- Algorithm --> 求1到n的和
- DragonBoard 410c高速扩展口详解
- DragonBoard 410c低速扩展口详解
- "Google Chrome 未响应。 是否立即重新启动?"的解决方法
- The Go Programming Language(读书笔记)
- django入门1
- Selenium和Google Chrome浏览器的配合问题
- Dragon board 410c硬件简述
- 模式识别之knn---KNN(k-nearest neighbor algorithm)--从原理到实现
- 高仿google now效果的呼吸按钮简单实现
- GoldenGate配置(一)之单向复制配置
- go开发的web聊天室
- Google搜索语法