Доступ к свойству из метода C в Cocoa

Я пытаюсь изучить Objective C & Cocoa, но мне просто не удается получить доступ к свойству внутри объекта. В частности, объект из метода C. Я работаю с библиотекой динамики бурундука.

У бурундука есть что-то похожее на NSPoint под названием cpVect. Теперь у меня нет проблем с определением cpVect внутри моего объекта, но когда я пытаюсь создать средства доступа, используя @property и @synthesize, я продолжаю получать ошибки: так

@interface ControlsLayer : Layer {
    Sprite * touchMarker, *dragMarker;
    cpVect * forceVector;
}

работает отлично

но

@interface ControlsLayer : Layer {
    Sprite * touchMarker, *dragMarker;
    cpVect * forceVector;
}

@property (retain) cpVect forceVector;

@end

выдает ошибку "property 'forceVector' with 'retain' must be of object type"

поэтому без «сохранения» я получаю другую ошибку

"type of property 'forceVector' does not match type of ivar 'forceVector'"

Я хожу по кругу, пытаясь понять, есть ли какой-то конкретный сорт, который я могу использовать, это несовместимость между бурундуком и какао, или... или... Я не знаю. Бурундук очень легок в документации, и все примеры, которые я нашел, похоже, не используют объекты, все примеры просто используют один класс для обработки всего.

Любая помощь, очень признательна. Эта штука сводит меня с ума.


person gargantuan    schedule 30.03.2009    source источник


Ответы (2)


Ошибка, которую вы получаете, связана с тем, что семантика retain (т. е. управление памятью с подсчетом ссылок, когда установщик увеличивает счетчик ссылок для нового значения и уменьшает счетчик ссылок для старого значения) имеет смысл только для объектов Objective-C. Семантика по умолчанию для свойств — retain, но вы можете указать, что свойство должно быть assign следующим образом:

@property (assign) cpVect *forceVector;

где я предполагаю, что свойство на самом деле является cpVect*, а не cpVect, как вы написали.

person Barry Wark    schedule 30.03.2009
comment
Этот ответ правильный, но WRT исходного кода, вероятно, имеет смысл изменить ivar, чтобы он не был указателем. Указатель на общедоступную структуру в качестве переменной экземпляра встречается довольно редко. - person Chuck; 31.03.2009

У вас есть указатель на cpVect в вашей переменной экземпляра, но не в вашем свойстве.

Попробуй это:

@property (assign) cpVect * forceVector;

person Mel    schedule 30.03.2009
comment
благодаря вам обоим это сработало. Я потратил около 6 часов, пытаясь заставить это работать. Хотел бы я, чтобы вы оба ответили правильно. - person gargantuan; 31.03.2009