2016-03-22 5 views
1

Как получить связанный объект из другого классаПочему я не могу получить связанный объект из другого класса?

Мой код:

#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 *[email protected]; 
     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) равна нулю.

Почему я не могу получить связанный объект из вышеуказанного кода. Не можем ли мы получить связанный объект из другого класса? Спасибо!

ответ

2

Проблема в вашем ключе. Вероятно, вы определяете эти классы в разных файлах. Не используйте ключевое слово static, статические переменные могут быть доступны только в пределах одной единицы перевода. Это означает, что у вас есть новая копия NUMBER для каждого файла. Удалить static ключевое слово и добавить extern декларацию в Person.h заголовке:

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 
Смежные вопросы