Objective-C Associated Objects 通过Category添加实例变量

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

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 

@interface UITableView (Property)

@property (nonatomic, copy) NSString *title;

@end

//
//  UITableView+Property.h
//  tableView
//

#import "UITableView+Property.h"
#import 

@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 通过Category添加实例变量)