2016-03-22 4 views
1

は次のとおりです。なぜ他のクラスから関連オブジェクトを取得できないのですか?</p> <p>に別のクラスから私のコードを関連付けられているオブジェクトを取得する方法

#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)がnullです。

なぜ上記のコードから関連オブジェクトを取得できないのですか?他のクラスから関連オブジェクトを取得できないのですか?ありがとうございました!

答えて

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 
関連する問題