有没有一种简单的方法来存储对数组中任意实例变量的引用?

时间:2009-08-12 07:41:24

标签: iphone

我想在一个数组中存储aribrary对象的实例变量引用,这样我就可以迭代数组并设置这些实例变量。

我是否必须向阵列提供他们的内存地址?喜欢

[arr addObject:&anIvar];

2 个答案:

答案 0 :(得分:0)

从技术上讲,您可以通过将其转换为NSNumber来获取ivar的地址并将其存储在NSArray中。不过,最好存储一对值:目标对象和目标属性,并使用KVC来设置它们:

[myArray addObject:[NSArray arrayWithObjects:self, @"someProperty", nil]];

难以接受:

for(NSArray *pairs in myArray) {
    [[pairs objectAtIndex:0] setValue:myValue forKey:[pairs objectAtIndex:1]];
}

答案 1 :(得分:0)

已编辑(旧答案基于对问题的误解。)

获取指向实例变量的指针的最简单方法是使用get访问器(如果存在)。例如:

@interface MyClass : NSObject {
  UIView* aView;  // Protected by default.
}
@property (nonatomic, retain) UIView* aView;

// Elsewhere in the code..
MyClass* myClass = [self getThatObject];
UIView* viewOfMyClass = myClass.aView;
// You may now do what you wish with viewOfMyClass, which is a reference to
// myClass's aView object, including add it to an array for later use.

您有时可以通过将对象视为结构来获取指向实例变量的指针。例如:

@interface MyClass : NSObject {
  @public
  UIView* aView;
}

// Later, in another part of the code...
MyClass* myClass = [self getThatObject];
UIView* viewOfMyClass = myClass->aView;
viewOfMyClass.tag = 100;  // Just changed myClass's aView's tag.

这是有效的,因为aViewMyClass中的公共实例变量。

如果你想要搞乱的实例变量是受保护的或私有的,并且没有访问者,那么它就更难了。如果它是您自己的类,您只需添加一个访问者。

如果它不是你的类,那么这是一个明确的信号,如果你使用这样的指针,你将打破封装。所以我不推荐它,但你仍然可以通过一些聪明的演员实现这个目标。