Objective C - 访问另一个实例的实例变量?
问题描述:
鉴于我们在同一个类中工作,是否可以访问另一个实例的变量?Objective C - 访问另一个实例的实例变量?
或者,换句话说,你能在目标C做到这一点的Java代码(在Java中工作,我以前做过):
class Matrix {
private int mat[] = new int[16]; //wouldn't be a pointer in C
public Matrix (Matrix m){
for (int i = 0; i < 16; i++){
this.mat[i] = m.mat[i]; //<-- this here
}
}
}
由于阵列不能在目标C性能,我不能让mat[]
成为一个属性。那么有没有办法做到这一点?
答
你可以做到这一点完全没有问题,你就不能让实例变量(伊娃)到属性:
@interface Matrix : NSObject
{
@private
int mat[16];
}
- (id) initWithMatrix:(Matrix *)m;
@end
@implementation Matrix
- (id) initWithMatrix:(Matrix *)m
{
if ((self = [super init]))
{
for(int i = 0; i < 16; i++)
mat[i] = m->mat[i];
// Nota bene: this loop can be replaced with a single call to memcpy
}
return self;
}
@end
答
你可以使用一个NSArray来存放NSNumbers而不是一个普通的旧的c int数组 - 然后你可以使用它作为一个属性。
像这样也许:
self.mat = [NSMutableArray arrayWithCapacity:16];
for(int i = 0; i < 16; i++) {
[self.mat addObject:[NSNumber numberWithInt:[m.mat objectAtIndex:i]]];
}
+0
这似乎有点臃肿,再加上最终目标是数组直接传递到OpenGL,这很可能需要使用此方案进行一些转换。 – Tustin2121 2011-05-09 03:36:43
答
最接近的比喻将返回int *
只读属性:
@interface Matrix : NSObject {
@private
int values[16];
}
@property (nonatomic, readonly) int *values;
@end
@implementation
- (int *)values
{
return values;
}
@end
对于Matrix
类型,你真的应该使用struct
或Objective- C++;所有方法调度/ ivar查找都会为内部循环增加大量开销
答
数组不能是属性。但是指向一组C数据类型的指针可以。只需使用assign属性,并在将它作为数组索引之前检查NULL。
这是我正在寻找的确切的东西:一种访问它的方式,而不使它成为一个属性(因此是公共的)。我不知道你可以在Objective-C和Objective-C对象中做一个指针参考。 (并感谢你的好消息)。 :) – Tustin2121 2011-05-09 03:29:26