如何从Objective-C中的类属性中获取值?

Ody*_*dys 10 iphone reflection cocoa-touch objective-c

我想使用反射从objective-c类中获取变量值.

company.h看起来像

@interface Company : NSObject {
}
@property (nonatomic, retain) NSString* phone;
- (NSString*) getPropertyValueByName: (NSString*) paramName;
Run Code Online (Sandbox Code Playgroud)

company.m看起来像

@implementation Company
@synthesize phone;
- (NSString*) getPropertyValueByName: (NSString*) paramName
{    
    id me = self;
    value = [me objectForKey: paramName];
    return value;
}
@end
Run Code Online (Sandbox Code Playgroud)

我这样使用:

Company* comp = [Company new];
comp.phone = @"+30123456";

NSString* phone = comp.getPropertyValueByName(@"phone");
Run Code Online (Sandbox Code Playgroud)

我得到的是一个例外:

-[Company objectForKey:]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)

Abi*_*ern 10

使用键值编码可以更轻松地完成此操作.

已经有一种方法可以通过传递字符串来获取属性的值:

-(id)valueForKey:(NSString *)keyName;
Run Code Online (Sandbox Code Playgroud)

您不需要为此编写自己的方法.


Mik*_*yev 6

那应该是valueForKey而不是objectForKey.objectForKey是一个NSDictionary实例方法.除此之外,您的代码中存在潜在的错误.上面方法中的返回类型是字符串,但是在返回之前不要将它强制转换为NSString.即使你确定它总是返回一个字符串,最好避免任何疑问.在声明NSString属性时,您应该复制它而不是保留它.而且,如果您可以轻松地说出声明"我"变量的重点是什么:

[self valueForkey:paramName];
Run Code Online (Sandbox Code Playgroud)

  • 将你要从id返回的值转换为字符串没有意义.它不会抑制任何警告,并且在运行时完全没有任何区别. (4认同)