如何通过在运行时生成的NSString访问实例变量(反射)

时间:2014-07-14 21:26:45

标签: ios objective-c reflection nsarray introspection

我有以下小代码难题......

- (void) transmitArray {

    NSString* arrayName = @"array1";

    NSArray* array1 = [NSArray arrayWithObject:@"This is Array 1"];
    NSArray* array2 = [NSArray arrayWithObject:@"This is Array 2"];

    NSMutableArray* targetArray = [NSMutableArray arrayWithCapacity:1];

}

有没有办法使用字符串“array1”来访问NSArray'array1'所以我可以将它复制到目标数组中..因此,如果字符串读取“array2”,我将能够访问第二个数组?

我读到了使用NSSelectorFromString来创建选择器,并且这种技术被称为“内省”,但除此之外,我感到难过......

希望有人可以提供帮助!

2 个答案:

答案 0 :(得分:1)

如果您将array1声明为属性,则可以这样执行:

#import "ViewController.h"

@interface ViewController ()

@property NSArray *array1;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.array1 = [NSArray arrayWithObjects:@"Hello", @"world!", nil];

    NSArray *array2 = [self valueForKeyPath:@"array1"];

    NSLog(@"%@", array2);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

答案 1 :(得分:1)

不是真的。如果它是类的实例变量(通常称为属性),那么您可以使用内省来检查对象并获取/设置所需的变量。您可以使用KVO方法

setValue:(id) ForKeyPath:(NSString *)

valueForKeyPath:(NSString *)

访问它们

但是,您无法使用实例方法(直接)内部声明的局部变量来执行此操作。我建议用你的数组填充一个字典,然后用它作为查找表

NSMutableDictionary *arrays = [[NSMutableDictionary alloc] init];

NSArray *array1 = @[@"This is Array 1"];
[arrays setObject:array1 forKey:@"array1"];

NSArray *array2 = @[@"This is Array 2"];
[arrays setObject:array1 forKey:@"array2"];

//grab a copy of array1
NSArray *targetArray = [arrays[@"array1"] copy];