我下载了一个代码来测试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进行类型转换?
答案 0 :(得分:2)
Objective-C运行时并不关心对象的实际类型,无论如何它都会向它发送消息(当然,如果对象没有响应它,事情就会变得很糟糕)。编译器看到“哦,NSArray响应计数,他们声称这是一个NSArray,他们发送-count,所以这一定是好的!”。
那就是说,这非常粗略,并且在检查respondsToSelector之后转换为(id)而不是(NSArray *):更清楚地说“我们不知道这是什么,除了它实现了这个方法”。