美文网首页
Objective-C Associated Objects 通

Objective-C Associated Objects 通

作者: lance017 | 来源:发表于2017-02-06 09:57 被阅读9次

    本文引用于 雷纯锋的技术博客 ,只是摘抄了如何使用的地方,剩余的原理及实验可到此文查看。

    Associated Objects 主要有以下三个使用场景:

    1. 为现有的类添加私有变量以帮助实现细节;
    2. 为现有的类添加公有属性;
    3. 为 KVO 创建一个关联的观察者。

    相关函数

    void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
    id objc_getAssociatedObject(id object, const void *key);
    void objc_removeAssociatedObjects(id object);
    
    • objc_setAssociatedObject 用于给对象添加关联对象,传入 nil 则可以移除已有的关联对象;
    • objc_getAssociatedObject 用于获取关联对象;
    • objc_removeAssociatedObjects 用于移除一个对象的所有关联对象。

    key 值

    函数当中的 key 必须是唯一常量,一般有以下三种定义key的方法

    1. 声明 static char kAssociatedObjectKey; ,使用 &kAssociatedObjectKey 作为 key 值;
    2. 声明 static void *kAssociatedObjectKey = &kAssociatedObjectKey; ,使用 kAssociatedObjectKey 作为 key 值;
    3. 用 selector ,使用 getter 方法的名称作为 key 值。

    第三种省掉了一个变量名,推荐。

    关联策略

    在给一个对象添加关联对象时有五种关联策略可供选择:

    关联策略 | 等价属性 | 说明
    ---|---
    OBJC_ASSOCIATION_ASSIGN | @property (assign) | 弱引用关联对象
    OBJC_ASSOCIATION_RETAIN_NONATOMIC | @property (strong, nonatomic) | 强引用关联对象,且为非原子操作
    OBJC_ASSOCIATION_COPY_NONATOMIC | @property (copy, nonatomic) | 复制关联对象,且为非原子操作

    具体使用

    //
    //  UITableView+Property.h
    //  tableView
    //
    
    #import <UIKit/UIKit.h>
    
    @interface UITableView (Property)
    
    @property (nonatomic, copy) NSString *title;
    
    @end
    
    
    //
    //  UITableView+Property.h
    //  tableView
    //
    
    #import "UITableView+Property.h"
    #import <objc/runtime.h>
    
    @implementation UITableView (Property)
    
    - (NSString *)title {
        NSString *str = objc_getAssociatedObject(self, @selector(title));
        if (str == nil) {
            str = @"title";
        }
        return str;
    }
    
    - (void)setTitle:(NSString *)title {
        objc_setAssociatedObject(self,@selector(title),title,OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    @end
    
    

    相关文章

      网友评论

          本文标题:Objective-C Associated Objects 通

          本文链接:https://www.haomeiwen.com/subject/jduyittx.html