我想在一个数组中存储aribrary对象的实例变量引用,这样我就可以迭代数组并设置这些实例变量。
我是否必须向阵列提供他们的内存地址?喜欢
[arr addObject:&anIvar];
答案 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.
这是有效的,因为aView
是MyClass
中的公共实例变量。
如果你想要搞乱的实例变量是受保护的或私有的,并且没有访问者,那么它就更难了。如果它是您自己的类,您只需添加一个访问者。
如果它不是你的类,那么这是一个明确的信号,如果你使用这样的指针,你将打破封装。所以我不推荐它,但你仍然可以通过一些聪明的演员实现这个目标。