zoukankan      html  css  js  c++  java
  • 利用类别(Category)为对象添加”实例变量”

    利用类别(Category)为对象添加”实例变量”

     

    主要利用ObjectiveC的C API中函数:

    void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    id objc_getAssociatedObject(id object, const void *key)

    原理详细参见官方的ObjectiveC Runtime Reference.

    好了,现在直接写怎么做了.

    1.在定义类别之前, 引入runtime.

    #import <objc/runtime.h>

    2.定义&实现类别(以UIView为例)
    定义:

    @interface UIView(AddVariables)
    
    @property (nonatomic, retain) NSString *viewName;
    
    @end

    实现:

    // 定义存取的Key
    static const char *viewNameKey = "viewNameKey";
    
    @implementation UIView(AddVariables)
    
    // get方法
    - (NSString *)viewName {
        return (NSString *)objc_getAssociatedObject(self, viewNameKey);
    }
    // set方法
    - (void)setViewName:(NSString *)newViewNameKey {
        objc_setAssociatedObject(self, viewNameKey, newViewNameKey, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    @end

    3.调用测试:

    - (void)viewDidLoad {
    
        UIView *testView = [[UIView alloc] initWithFrame:self.view.bounds];
        [self.view addSubview:testView];
        [testView release];
    
        [testView setViewName:@"Nori's View"];
        NSLog(@"[testView's newPropery]:%@", testView.viewName);
    
        [super viewDidLoad];
    }

    输出结果如下:

    testView's newPropery:Nori's View

    另外有几篇不错的文章关于类别和关联的

    iOS学习系列 - 扩展机制category与associative

    http://www.cnblogs.com/liping13599168/archive/2012/09/13/2682664.html

    利用类别(Category)为对象添加”实例变量”

    http://blog.csdn.net/qhexin/article/details/7692846

     
     
    http://blog.csdn.net/zhangxingping/article/details/7619444
  • 相关阅读:
    Today
    react-decorator-track 解耦-埋点方案
    Decorator
    webpack4强势来袭
    同源策略与跨域处理
    html语义化
    深度遍历与广度遍历的理解
    Javascript 模块化理解
    算法之排序
    数组去重
  • 原文地址:https://www.cnblogs.com/leeAsia/p/3412016.html
Copyright © 2011-2022 走看看