2011-02-08 3 views
3

実行時にオブジェクトに特定のメソッドがあるかどうかを確認することに慣れています。ただし、Core Dataを使用している場合、私の@dynamicプロパティの予想される動作が見られません。たとえば、クラスにsortOrderプロパティがある場合、Objective-Cランタイムを使用して、このプロパティが実行時に存在することを確認できます。しかし、私が関連するClassオブジェクトにinstancesRespondToSelector:かどうかを問い合わせると、私はNOに戻る。ランタイムを使用して利用可能なメソッドを列挙した場合、動的getter/setterはリストに表示されません。これは一貫していますが、私が期待したものではありません。実行時にNSManagedObjectのサブクラスが特定のプロパティを持っているかどうかを確認する方法

質問:NSManagedObjectサブクラスのインスタンスが@dynamicプロパティに対応するgetter/setterセレクタに応答するかどうかをランタイム検査を使用せずに簡単に判別できますか?

答えて

4

私はNSManagedObjectオブジェクトで以下のメソッドを使用してそのプロパティのリストを取得しました。多分それは正しい方向にあなたを指します....

- (NSMutableArray *) propertyNames: (Class) class { 
    NSMutableArray *propertyNames = [[NSMutableArray alloc] init]; 
    unsigned int propertyCount = 0; 
    objc_property_t *properties = class_copyPropertyList(class, &propertyCount); 

    for (unsigned int i = 0; i < propertyCount; ++i) { 
     objc_property_t property = properties[i]; 
     const char * name = property_getName(property); 
     [propertyNames addObject:[NSString stringWithUTF8String:name]]; 
    } 
    free(properties); 
    return [propertyNames autorelease]; 
} 
+0

私はちょうどのための*正確に*、行を行う方法で最後の仕上げを置きますあなたが何を示唆しているのか。ひどく高価ですが、それは仕事を完了します。私のアプローチを肯定してくれてありがとう。 – warrenm

+0

+1これは、適切なコンテキストで便利なコードです。 – jakev

+0

@warrenm私はほとんどそれを呼び出す必要はないので、私は費用に気づいていません。結果をディスクにキャッシュすることもできます。データモデルを更新する場合は、そのキャッシュをクリアするだけです。喜んで助けてください。 –

12

あなたはNSManagmentObjectしかしNSEntityDescriptionを調べることができます。

- (BOOL)hasPropertyWithName:(NSString *)name 
{ 
    NSEntityDescription *desc = self.entity; 
    return [desc.attributesByName objectForKey:name] != nil; 
} 
関連する問題