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 は count に応答します。彼らはこれが NSArray であると主張し、-count を送信しているので、これで問題ないはずです!」と認識します。

とは言っても、これはかなり大雑把であり、respondsToSelector: をチェックした後に (NSArray *) の代わりに (id) にキャストすることは、「このメソッドを実装していること以外は、これが何であるかはわかりません」と言うより明確な方法です。

于 2012-04-19T04:38:39.257 に答える