Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 有没有一种简单的方法可以在数组中存储对任意实例变量的引用?_Iphone - Fatal编程技术网

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

Iphone 有没有一种简单的方法可以在数组中存储对任意实例变量的引用?,iphone,Iphone,我想将aribrary对象的实例变量引用存储在一个数组中,这样我就可以遍历该数组并设置这些实例变量 我是否必须向阵列提供它们的内存地址?像 [arr addObject:&anIvar]; ?从技术上讲,您可以获取ivar的地址,并通过将其转换为NSNumber将其存储在NSArray中。不过,最好存储一对值:target object和target property,并使用KVC设置它们: [myArray addObject:[NSArray arrayWithObjects:se

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

我是否必须向阵列提供它们的内存地址?像

[arr addObject:&anIvar];

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

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

for(NSArray *pairs in myArray) {
    [[pairs objectAtIndex:0] setValue:myValue forKey:[pairs objectAtIndex:1]];
}
旧答案是基于对问题的误解

获取实例变量指针的最简单方法是使用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.
有时,您可以通过将对象视为结构来获取指向实例变量的指针。例如:

@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中的一个公共实例变量

如果要处理的实例变量是protected或private,并且没有访问器,那么它就有点难了。如果它是您自己的类,您可以添加一个访问器


如果不是您的类,那么这是一个明显的迹象,表明如果您使用这样的指针,您将破坏封装。所以我不推荐它,但你仍然可以通过一些巧妙的选择来实现这个目标。

这不是我想要的。我想存储对数组中任何对象的实例变量的引用,这样我就可以迭代所有对象,并将它们的值设置为我知道可以分配什么类型的值。啊哈!我才意识到误会。我认为您需要指向作为类成员的变量的指针,可能来自类之外。我很困惑,因为那些被称为C++的成员Valube,在我成长的地方;我刚刚看到实例变量在Objective-C王国中的含义是一样的,或者说MSKVC看起来不错,但是我也可以在数组中直接引用实例变量吗?是的,如[NSNumber numberwhithint:&myivar]