2012-07-25 95 views
0

我想從一個Objective-C類獲取實例變量的名稱。假設我的課程如下所示:如何在Objective-C中獲取實例變量的名稱?

@interface MyClass : NSObject 

@property (nonatomic, copy) NSSNumber *myVar; 

@end 

鑑於myVar,我希望得到「myVar」。然後我可以在這樣的日誌中使用它:

MyClass *myObject = [[myClass alloc] init]; 
NSLog(@"The variable is named: %@", getVarName([myObject myVar])); 

然後日誌會說:The variable is named myVar。感謝您的幫助!

PS我想這樣做的原因是創建一個編碼變量進行歸檔的方法。所以,當我寫我encodeWithCoder方法我可以做這樣的事情:

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    NSArray *varsForEncoding = [[NSArray alloc] initWithObjects:var1, var2, var3, nil]; 
    for (NSObject *var in varsForEncoding) 
    { 
     [aCoder encodeObject:var forKey:getVarName(var)]; 
    } 
} 

然後做反向的initWithCoder。這樣可以避免錯字,例如,在編碼時使用密鑰@"myVar",但在初始化器中鍵入@"mVar"

回答

7

你可以用這個方法嘗試:

//returns nil if property is not found 
-(NSString *)propertyName:(id)property { 
    unsigned int numIvars = 0; 
    NSString *key=nil; 
    Ivar * ivars = class_copyIvarList([self class], &numIvars); 
    for(int i = 0; i < numIvars; i++) { 
    Ivar thisIvar = ivars[i]; 
    if ((object_getIvar(self, thisIvar) == property)) { 
     key = [NSString stringWithUTF8String:ivar_getName(thisIvar)]; 
     break; 
    } 
    } 
    free(ivars); 
    return key; 
} 

source

+1

工作很好,謝謝。我只需鏈接到libobjc.dylib並導入。 – 2012-07-25 22:52:55

0

只需使用一個單一的代碼行,因爲這。

#define NSLogVariable(x) NSLog(@"Variable : %s = %@",#x,x) 

與頭宏定義它沿和在任何地方使用它。 如:

NSString *[email protected]"abcd"; 
NSLogVariable(myObj); 

它會顯示

Variable : myObj = "abcd" 

希望它可以幫助一些之一。