2011-05-07 81 views
2

鉴于我们在同一个类中工作,是否可以访问另一个实例的变量?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[]成为一个属性。那么有没有办法做到这一点?

回答

3

你可以做到这一点完全没有问题,你就不能让实例变量(伊娃)到属性:

@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 
+0

这是我正在寻找的确切的东西:一种访问它的方式,而不使它成为一个属性(因此是公共的)。我不知道你可以在Objective-C和Objective-C对象中做一个指针参考。 (并感谢你的好消息)。 :) – Tustin2121 2011-05-09 03:29:26

3

你可以使用一个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

1

最接近的比喻将返回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查找都会为内部循环增加大量开销

0

数组不能是属性。但是指向一组C数据类型的指针可以。只需使用assign属性,并在将它作为数组索引之前检查NULL。