0

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"して初期化子を入力するなどです。

4

2 に答える 2

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;
}  

ソース

于 2012-07-25T21:32:35.173 に答える
0

このように 1 行のコードを使用するだけです。

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

ヘッダーとともにマクロとして定義し、どこでも使用できます。 例えば:

NSString *myObj=@"abcd";
NSLogVariable(myObj);

表示されます

Variable : myObj = "abcd"

それが誰かを助けることを願っています。

于 2015-08-05T11:25:07.373 に答える