如果您不需要在运行时检查对象属性的动态级别,那么 anNSArray
是最直接和可读的方法;就效率而言,我想创建一个动态类型的数组void *
并迭代它可能会更快,但考虑到典型的大小,以值得怀疑的速度回报为你做更多的工作。
for (UISlider *slider in @[self.slider1, self.slider2, self.slider3]) {
[slider addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];
}
如果您确实需要调查您的属性,那么我会像其他问题的答案所建议的那样处理它。我的回答起初建议解析属性属性字符串以考虑自定义命名属性,但显然 KVC 会为您处理这些问题。
unsigned int numberOfProperties;
objc_property_t *properties = class_copyPropertyList([self class], &numberOfProperties);
for (int i = 0; i < numberOfProperties; i++) {
objc_property_t property = propertieses[i];
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
id valueForProperty = [self valueForKey:propertyName];
if ([valueForProperty isKindOfClass:[UISlider class]]) {
[(UISlider *)valueForProperty addTarget:self
action:@selector(action:)
forControlEvents:UIControlEventValueChanged];
}
}
free(properties);