Как передать массив float * как свойство? - PullRequest
1 голос
/ 16 ноября 2011

Недавно я изменил тип одного из моих свойств с @property (readonly) NSImage *someData на @property (readonly) float *someData. Данные представляют собой большой массив с плавающей точкой. Перед изменением NSImage был создан из этих данных с плавающей точкой.

С тех пор всякий раз, когда я звонил [self didChangeValueForKey:@"someData"] в своем коде, я получал следующую ошибку:

[MyController 0x109161710> valueForUndefinedKey:]:
this class is not key value coding-compliant for the key someData.

Все остальные свойства продолжали работать просто отлично. Теперь одним из решений этой проблемы является следующий фрагмент кода:

- (id)valueForUndefinedKey:(NSString *)key {
    if ([key isEqualToString:@"someData"]) {
        return someData; // throws a warning because (float*) is not id
    } else {
        return [super valueForUndefinedKey:key];
    }
}

Пока это работает, но выдает предупреждение о incompatible pointer type returning 'float *' from a function with result type 'id'. Так что это не может быть окончательным решением.

Итак, насколько я понимаю, у вас не может быть свойства типа указателя. Это правильно?
Кроме того, я действительно хочу передать этот указатель через свойство. Есть ли какой-нибудь способ обернуть указатель в какую-то структуру данных, которая бы работала?

Редактировать: Размер плавающего массива может составлять несколько 100 Мб, поэтому я не хочу копировать его, если смогу помочь. Я полагаю, что копирование в NSArray поможет, но это определенно ухудшит производительность.

Ответы [ 2 ]

4 голосов
/ 16 ноября 2011

Согласно комментарию @ BastiBechtold ниже: Использование NSValue для указания на массив - лучший способ инкапсулировать массив с плавающей точкой в ​​объекте NSObject без его копирования.

1 голос
/ 16 ноября 2011

Вы можете иметь свойство типа float*. Вы даже можете synthesize его аксессуары.

Вы не можете использовать протокол кодирования значения ключа на нем.

...