coding with objc & swift

使用objc的AssociatedObject函数给现有类添加新property

| Comments

Objective-C的Category(类别)是一个很强大的特性。使用Category我们可以给现有类增加一些新的方法。但是也仅限于方法,不能直接增加新的property。

很幸运,Objective-C还有更强大的运行时特性。通过运行时中的objc_setAssociatedObject/objc_getAssociatedObject函数,就可以很方便的为现有类增加新property。

如下面代码所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//
//  NSObject+Test.h
//  Test
//
//  Created by ZhangTinghui on 13-5-16.
//  Copyright (c) 2013年 ZhangTinghui. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSObject (Test)

@property (nonatomic, copy) NSString *testString;

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//
//  NSObject+Test.m
//  Test
//
//  Created by ZhangTinghui on 13-5-16.
//  Copyright (c) 2013年 ZhangTinghui. All rights reserved.
//

#import "NSObject+Test.h"
#import <objc/runtime.h>

@implementation NSObject (Test)

- (void)setTestString:(NSString *)testString
{
    objc_setAssociatedObject(self, @selector(testString), testString, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)testString
{
    return objc_getAssociatedObject(self, @selector(testString));
}

@end

但是,新加入的property也有一个限制。property对应的值无法通过NSCoding协议序列化。(实际上所有通过Category途径增加的数据都无法序列化。)

Comments