0

プロパティの型を取得するためにランタイム関数を使用しています (この方法を理解するのを手伝ってくれた eJames に感謝します)。プロパティの属性文字列は次のようになります。

T@"NSArray",&,Vstuff

プロパティの型が配列かどうかを確認する必要があります。現時点では、次のようにしています。

 - (BOOL)valueForKeyIsArray:(NSString *)key fromTagret:(id)target
{
    NSString *lowerCaseKey = [self convertToKVCKey:key];

    objc_property_t property = class_getProperty([target class], [lowerCaseKey UTF8String]);
    NSString *propertyAttrs = [NSString stringWithUTF8String:property_getAttributes(property)];
    NSString *encodedType = @"@\"NSArray\"";

    NSRange range = [propertyAttrs rangeOfString:encodedType options:NSLiteralSearch];
    return range.location != NSNotFound;
}

しかし、Apple はいつでも型定義文字列を変更できるので、この @"NSArray" 型文字列を生成したいと思います。@encode() で試してみましたが、うまくいきませんでした:

NSString *encodedType = [NSString stringWithUTF8String:@encode(NSArray *)];

では、この型文字列を生成するにはどうすればよいでしょうか? または、このプロパティ属性に配列型が含まれているかどうかを確認するより良い方法はありますか?

4

2 に答える 2

4

これを確認する方法はありません。Objective-C のソース コードでは、型付けされている変数NSArray *は、コンパイラが警告を発行するためだけに存在します。意味がなく、実行時には存在しません。を と誤って入力するNSArrayと、NSStringコンパイル時に多くの警告が表示されますが、コードは実行時にまったく同じように動作します。実行時にわかっていることは、ivar/property が「オブジェクト」であるということだけです。

もう 1 つの考え方は、Objective-C がコンパイルされると、すべてのオブジェクト参照がid参照になるということです。

于 2009-05-29T10:14:21.407 に答える
0

ランタイムが変更された場合、コードが壊れて先に進むことを受け入れるだけです。NSMutableArray *ただし、タイプ、CFArrayRef、またはの ivar を誤って分類している可能性があると思いますCFMutableArrayRef。また、すべてのキーが宣言されたプロパティに直接対応していると想定しているようです。

最もクリーンな解決策は、テストに使用されているサンプル オブジェクト (ターゲット) がそのキーに対して nil 以外の値を持っている必要があることをアサートし、値を取得してそれをテストすること[[target valueForKey:key] isKindOfClass:[NSArray class]]です。

于 2010-09-25T02:25:13.757 に答える