#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, прежде чем индексировать его как массив.