问题描述
我想创建一个Objective-C基类,在运行时对所有属性(不同类型)执行操作。因为属性的名称和类型不会总是知道,我该怎么做呢?
I want to create an Objective-C base class that performs an operation on all properties (of varying types) at runtime. Since the names and types of the properties will not always be known, how can I do something like this?
@implementation SomeBaseClass
- (NSString *)checkAllProperties
{
for (property in properties) {
// Perform a check on the property
}
}
EDIT: $ c> - (NSString *)description: override。
This would be particularly useful in a custom - (NSString *)description:
override.
推荐答案
(在我看到他之前开始写这篇文章),下面是一个使用Objective-C运行时API循环并打印类中每个属性信息的示例程序:
To expand on mvds' answer (started writing this before I saw his), here's a little sample program that uses the Objective-C runtime API to loop through and print information about each property in a class:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface TestClass : NSObject
@property (nonatomic, retain) NSString *firstName;
@property (nonatomic, retain) NSString *lastName;
@property (nonatomic) NSInteger *age;
@end
@implementation TestClass
@synthesize firstName;
@synthesize lastName;
@synthesize age;
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
unsigned int numberOfProperties = 0;
objc_property_t *propertyArray = class_copyPropertyList([TestClass class], &numberOfProperties);
for (NSUInteger i = 0; i < numberOfProperties; i++)
{
objc_property_t property = propertyArray[i];
NSString *name = [[NSString alloc] initWithUTF8String:property_getName(property)];
NSString *attributesString = [[NSString alloc] initWithUTF8String:property_getAttributes(property)];
NSLog(@"Property %@ attributes: %@", name, attributesString);
}
free(propertyArray);
}
}
输出:
注意这个程序需要编译ARC已开启。
Note that this program needs to be compiled with ARC turned on.
这篇关于在运行时循环访问所有对象属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!