Objective C — Доступ к переменным экземпляра другого экземпляра?

#iphone #objective-c #c

#iPhone #objective-c #c

Вопрос:

Возможно ли получить доступ к переменным другого экземпляра, учитывая, что мы работаем в том же классе?

Или, другими словами, можете ли вы выполнить этот Java-код (который работает на Java, я делал это раньше) в Objective C:

 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
        }
    }
}
  

Учитывая, что массивы не могут быть свойствами в Objective C, я не могу превратить mat[] в свойство. Есть ли какой-либо способ сделать это тогда?

Ответ №1:

Вы можете сделать это совершенно нормально, вы просто не можете превратить переменную экземпляра (ivar) в свойство:

 @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
  

Комментарии:

1. Это именно то, что я искал: способ получить к нему доступ, не делая его свойством (и, следовательно, общедоступным). Я не знал, что вы можете выполнять перенос указателя в Objective-C и с объектом Objective-C. (И спасибо за хорошее замечание). 🙂

Ответ №2:

Вы могли бы использовать 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]]];
}
  

Комментарии:

1. Это кажется немного раздутым, плюс конечная цель — передать массив непосредственно в OpenGL, что, скорее всего, потребует некоторого преобразования с помощью этой схемы.

Ответ №3:

Ближайшей аналогией было бы свойство только для чтения, которое возвращает 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 добавят много накладных расходов во внутренние циклы

Ответ №4:

Массивы не могут быть свойствами. Но указатели на массив типов данных C могут. Просто используйте свойство assign и проверьте наличие NULL, прежде чем индексировать его как массив.