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

来源:互联网 发布:下载和目软件 编辑:程序博客网 时间:2024/06/06 01:29

 分类的作用:它可以在不改变原来的类的内容的基础上,为类增加一些方法。

 

 分类使用注意:

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

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

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

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

 

 (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





0 0