我试图找出一种在给定对象的情况下提取属性名称的方法,而不是所有属性的名称,而是一个特定的名称。为了做到这一点,我在课堂上实现了这个方法:
-(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 类中,我有两个属性 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 属性。这个想法是使 TextEditingVC 尽可能通用,因为在我的应用程序中,我必须编辑作为各种类的属性的 NSString。
当然我可以简单地使用:
NSString *key=@"p";
代替:
NSString * key=[foo keyForProperty:foo.p];
但在那种情况下,字符串将在我的代码中被硬编码,我想避免它,为了良好的编程实践,或者我在这种特殊情况下试图避免硬编码字符串是错误的?