申報

2016-06-30 134 views
1
類別

實例變量我定義了一個類別的NSDictionary申報

的NSDictionary + AddMyFunc.m

// Compiler error: expected identifier or '(' 
@implementation NSDictionary (AddMyFunc) { 
    NSInteger myNum; 
} 

- (void)myFunc { 
    //Compiler error: use of undeclared identifier 'myNum' 
    myNum = //some operation 
} 

@end 

我要定義一個實例變量myNum,我做到了上面的方法,但是我有上面顯示的編譯器錯誤。 爲什麼我得到這些錯誤,如何擺脫它們?

+0

爲什麼downvote?我無法在網上找到答案,所以我在這裏問,這有什麼問題?可能有其他人和我一樣有困惑。問題的解釋優於低投訴。 –

回答

0

實例變量在類別中不受支持。如果您知道某個實例的實際情況以及分配存儲的方式,這是有道理的。

因爲類別可能以任何順序加載,所以編譯器和鏈接器無法知道實例變量的地址是什麼。

如果您需要模仿屬性,請使用關聯的對象。

0

可以使用相關聯的對象

#import <objc/runtime.h> 

static const void *ImageTagKey = &ImageTagKey; 

@implementation UIImage (Tagged) 

- (void)setTag:(NSSting *)tag 
{ 
    objc_setAssociatedObject(self, ImageTagKey, tag, OBJC_ASSOCIATION_COPY_NONATOMIC); 
} 

- (NSString *)tag 
{ 
    return objc_getAssociatedObject(self, ImageTagKey); 
} 

@end 
1

您正在嘗試使用類擴展注入實例變量與一個類別,其中,該功能不可用的功能類別添加屬性。類擴展比類更強大,但不能添加到其他人的類中。

爲了補充一點,就像一個實例變量的類的屬性,使用相關的對象,像這樣:

@interface NSDictionary (AddMyFunc) 
@property (nonatomic, assign) NSNumber *myNum; 
@end 

實現:

此屬性是不是一個真正的實例變量,因此您無法使用指針->語法訪問它。但是,點語法和方括號語法都可用。

+0

小挑逗。您的解決方案不允許添加實例變量。它可以讓你添加一個屬性。 – rmaddy

+0

@rmaddy這是一個公平的觀察,我編輯,以明確它是一個屬性,而不是一個真正的實例變量。謝謝! – dasblinkenlight