6

Objective-C のあるクラスのオブジェクトが「isKindOfClass」であると主張することがよくあります。私はこのようにします:

NSAssert([obj isKindOfClass:[AClass class]], @"%@ should be kind of class %@", obj, [[AClass class] description]);

ショートカットを作成する最良の方法について疑問に思っています。次のようなマクロを定義することを考えています。

#define NSClassAssert(obj, class)  NSAssert([obj isKindOfClass:class], @"%@ should be of class %@", obj, [class description])

これにより厄介な扱いにくいコンパイルエラーや実行時の問題が発生するのではないかと心配しています.この方法で何か根本的に間違っていることはありますか?

4

3 に答える 3

3

そもそもなぜこれをしたいのかを正確に尋ねる必要があります。あなたが言った:

客観的 c がどれほど寛容で動的であるかを考えると、私はコードを「悪用の証拠」にするのが好きです。認識されないセレクタ メッセージの代わりに、オブジェクトがどのクラスであると予想されたかを示すメッセージが表示されます。

署名で宣言された型と一致しないオブジェクトをメソッドに渡す場合、つまり、次のようなことを行います。

- (void)doSomething:(NSArray *)array { /* Do something * }

- (void)doSomethingElse
{
    NSString *string = @"my string";
    [self doSomething:string];
}

警告が表示されるので、コンパイル時にオブジェクトの型が一致しないことを認識しておく必要があります。

もちろん、これは などのより一般的なタイプを使用する場合には保護されませんidが、認識されないセレクターが心配な場合は、アサートを使用する代わりに、オブジェクトがそのセレクターに応答するかどうかを確認する必要があります。

- (id)doSomething:(id)obj
{
    if ([obj respondsToSelector:@selector(calculateSomething)]) {
        return [obj calculateSomething];
    } else {
        NSLog(@"%@ does not respond to calculateSomething", obj);
    }
}

または、プロトコルを使用してメソッドの可用性を確認します。


ただし、そうは言っても、マクロは意図した目的で機能します。

于 2011-11-22T20:52:37.653 に答える