すべてのプロパティ名ではなく、特定のオブジェクト名からプロパティ名を抽出する方法を見つけようとしています。そのために、クラスにこのメソッドを実装しました。
-(NSString *)keyForProperty:(NSObject *)theProperty{
unsigned int propertyCount = 0;
objc_property_t * properties = class_copyPropertyList([self class], &propertyCount);
for (unsigned int i = 0; i < propertyCount; ++i) {
objc_property_t property = properties[i];
NSString *name=[NSString stringWithUTF8String:property_getName(property)];
NSObject * propertyValue=[self valueForKey:name];
if(propertyValue==theProperty){
free(properties);
return name;
}
}
free(properties);
return nil;
}
これは次のように機能します: クラス A のオブジェクト foo を取得して、プロパティ p の名前を知りました。
NSString *name=[foo keyForProperty:foo.p];
問題は、私のクラス A に 2 つのプロパティ p1 と p2 の両方の NSString があり、A の init メソッドでそれらの両方に @"" を割り当てることです。問題は、p1 と p2 が同じメモリ位置を指しているため、次のようになることです。
NSString *name=[foo keyForProperty:foo.p1];
と
NSString *name=[foo keyForProperty:foo.p2];
両方で同じ結果が得られます。@"" を両方のプロパティに割り当てているときにこれが起こらないようにする方法についてのアイデアはありますか? これを実装するより良い方法はありますか?要件は次のとおりです。
A* foo=[[A alloc]init];
クラスAの特定のプロパティ名を取得できる必要があります。
ありがとうございました。
これが必要な理由の説明:
私は UIViewController サブクラス TextEditingVC を持っています。これは、編集するオブジェクトと編集するオブジェクトを受け取り、編集するプロパティ名であり、編集プロセスは TextEditingVC インスタンスによって自動的に管理されます。
A *foo;
//lets edit property p
NSString *key=[foo keyForProperty:foo.p];
TextEditingVC *theVC=[TextEditingVC alloc]initWithEditableObject:foo withEditionKey:key];
//present theVC in some way
この TextEditingVC は、任意のオブジェクトの NSString プロパティを編集できる必要があります。私のアプリケーションでは、さまざまなクラスのプロパティである NSString を編集する必要があるため、 TextEditingVC をできるだけ一般的にするという考えです。
もちろん、私は単に使用することができます:
NSString *key=@"p";
それ以外の:
NSString * key=[foo keyForProperty:foo.p];
しかし、その場合、文字列は私のコードでハードコードされ、良いプログラミングの実践のためにそれを避けたいと思いますか、それともこの特定のケースでハードコードされた文字列を避けようとするのは間違っていますか?