1

我下载了一个代码来测试一个 nsobject 是否为空

测试是这样的:

-(BOOL) isNotEmpty
{


return !(self == nil
         || [self isKindOfClass:[NSNull class]]
         || ([self respondsToSelector:@selector(length)]
             && [(NSData *)self length] == 0)
         || ([self respondsToSelector:@selector(count)]
             && [(NSArray *)self count] == 0));

};

这部分让我感到困惑:

(NSData *)self length

作者怎么能像那样从 NSObject 中输入 NSData 呢?

4

1 回答 1

2

Objective-C 运行时并不真正关心它的对象的实际类型,它无论如何都会向它发送消息(当然,如果对象没有响应它,事情就会变得很糟糕)。编译器看到“哦,NSArray 响应计数,他们声称这是一个 NSArray,并且他们正在发送 -count,所以这一定没问题!”。

也就是说,这很粗暴,在检查 respondsToSelector: 之后强制转换为 (id) 而不是 (NSArray *) 是一种更清晰的方式来表示“我们不知道这是什么,除了它实现了这个方法”。

于 2012-04-19T04:38:39.257 回答