2011-05-07 72 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。