使用performSelector:访问BOOL属性

Se7*_*ays 4 cocoa objective-c declared-property

我正在使用performSelector:,它返回一个id对象,以调用其他几个方法.这些方法的返回类型实际上可以是某个BOOL,int,NSDate或任何其他类型的对象.

我如何判断返回的对象是否performSelector:BOOL?我尝试将其转换为NSNumber等等,但如果对象不是a,则会崩溃BOOL.

我有一个具有以下属性的类:

@property(retain,nonatomic) NSString* A;
@property(assign,nonatomic) BOOL B;
@property(retain,nonatomic) NSArray* C;
@property(assign,nonatomic) int64_t D;
Run Code Online (Sandbox Code Playgroud)

这个类是由框架生成的,所以我无法改变它.但是,我要循环A,B,C,D调用每个属性和检索数据.但是,正如您所看到的,返回类型可能会有所不同,我需要调整它.

我正在做类似的事情:

SEL s = NSSelectorFromString(@"A");
id obj = [object performSelector:s];
//check if obj is BOOL
//do something with obj
Run Code Online (Sandbox Code Playgroud)

jle*_*ehr 9

如果您只需要获取各种属性的值,请使用键值编码,它会自动包装标量类型,例如intBOOL实例中的标量类型NSNumber.所以你需要的只是以下几行:

id value = [object valueForKey:@"somePropertyName"];
Run Code Online (Sandbox Code Playgroud)

否则,您可以通过调用methodSignatureForSelector:目标对象提前检查返回类型,但考虑到您描述的情况,这似乎是一堆不必要的工作.

  • 而且,你不能使用`performSelector:`作为非对象返回类型.正如[其文档所说:](http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/doc/uid/20000052- BBCBGHFG)"对于返回除对象以外的任何内容的方法,请使用NSInvocation." (2认同)