为什么我无法从另一个类中获取相关对象?

时间:2016-03-22 16:16:36

标签: ios objective-c

如何从另一个类中获取关联对象

我的代码是:

#import <UIKit/UIKit.h>
static char NUMBER ='a';

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

@implementation Person

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSNumber *num=@10;
        objc_setAssociatedObject(self, &NUMBER, num, OBJC_ASSOCIATION_RETAIN);
    }
    return self;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    Person *p=[[Person alloc]init];
    NSNumber *num=objc_getAssociatedObject(p, &NUMBER);
    NSLog(@"%@",num);
}

@end

NSLog(@"%@",num)为空。

为什么我无法从上面的代码中获取关联的对象。我们不能从另一个类中获取相关对象吗?谢谢!

1 个答案:

答案 0 :(得分:2)

问题在于你的钥匙。您可能在不同的文件中定义此类。不要使用static关键字,静态变量只能在单个翻译单元中访问。这意味着您为每个文件提供了NUMBER的新副本。删除static关键字并在Person.h标题中添加extern声明:

Person.h:

extern const char NUMBER;

@interface Person : NSObject
@end

Person.m:

#import "Person.h"
#import "objc/runtime.h"

const char NUMBER ='a';

@implementation Person

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSNumber *num = @10;
        objc_setAssociatedObject(self, &NUMBER, num, OBJC_ASSOCIATION_RETAIN);
    }
    return self;
}

@end

ViewController.m:

#import "Person.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    Person *p = [[Person alloc]init];
    NSNumber *num = objc_getAssociatedObject(p, &NUMBER);
    NSLog(@"%@",num);
}

@end