Получить адрес свойства Objective-C (который является структурой C)

У меня есть класс Objective-C, который содержит структуру в стиле C. Мне нужно вызвать функцию C, передав указатель на этот член объекта (свойство a.k.a.). Что касается меня, я не могу понять, как получить адрес этой структуры Си. Используя традиционные& оператор, чтобы получить адрес, я получаю ошибку компилятора LValue.

typedef struct _myStruct
{
   int aNumber;
}MyStruct, *pMyStruct;

@interface MyClass : NSObject {
    MyStruct mystruct;
}
@property (readwrite) MyStruct myStruct;
@end

Следующий код приводит к ошибке компилятора:

MyClass* myClass = [[MyClass alloc] init];

MyStruct* p = &(myClass.myStruct);

Как мне получить указатель наmyStruct членmyClass объект?

 Chuck09 июл. 2009 г., 08:28
& Amp; Оператор принимает значение. Результатом вызова метода является значение.
 Matthew Flaschen09 июл. 2009 г., 07:46
Я не знаю, сработает ли это, но попробуйте MyStruct * p = (MyStruct *) & amp; (myClass.myStruct.aNumber);

Ответы на вопрос(4)

Часто есть довольно веские причины для выполнения того, о чем говорится в первоначальном посте, учитывая, что приложения Objective-C часто должны работать с API C / C ++, которые используют указатели на структуры и подобные типы, но в приложении Cocoa вы часто будете использовать хотите хранить такие данные в классах Objective-C для управления данными, сбора в массивах и словарях и т. д.

Хотя этот вопрос уже давно решен, я не вижу четкого ответа, а именно: у вас может быть метод, который возвращает адрес данных, поддерживающих ваше свойство, но в этом методе не используется «self» ; или он пройдет через аксессор и все равно не будет работать.

- (const MyStruct*) getMyStructPtr
{
    return &mystruct;
}

Обратите внимание, что я использую объявленное свойство из OP, но не ссылаюсь на него какself.mystruct, что приведет к ошибке компилятора (потому что это вызывает синтезированный метод получения).

 25 окт. 2016 г., 19:25
Спасибо, теперь мои подклассы могут наконец получить набор CGAffineTransform в родительском классе.
 25 окт. 2016 г., 21:12
Я использовал ваше решение в ответе на старый связанный вопрос:Objective-C Address of property expression
 10 июн. 2015 г., 11:09
В качестве конкретного примера, почему это полезно - я делаю некоторую работу с CoreMIDI и имею объект Objective-C, обертывающий структуру MIDIPacket, который позволяет мне сохранить его в NSArrays, а также добавить некоторые вспомогательные методы. Методы API фреймворка в C требуют указателя const на структуру, поэтому у моего класса target-C есть метод, подобный приведенному выше, для возврата указателя на член данных. Для простых типов структуры может быть предпочтительнее просто использовать NSValue, но поскольку MIDIPacket является динамическим (он может быть больше, чем его объявленный размер), лучше использовать специальный класс-обертку.

MyStruct mystruct является частным вMyClassЯ полагаю, когда вы делаетеmyClass.myStruct вы ссылаетесь только на сгенерированный метод доступа, а не на фактическую структуру.

Я не думаю, что вы можете получить доступ к переменной экземпляра (структура в данном случае) извне, потому что она является закрытой.

 09 июл. 2009 г., 08:14
Я также предполагаю, что myClass.myStruct получает значение, возвращаемое методом доступа, а не фактическую структуру, которая является тем, что я хочу. Предполагая, я делаю переменную экземпляра частной ... как я могу получить указатель на фактическую структуру, а не метод доступа?
 10 июл. 2009 г., 01:59
Вы можете попытаться вернуть адрес из метода-члена (см. Ответ Чака) или добавить класс в класс MyClass, который будет вызывать C api и передавать адрес структуры mystruct.

Свойство - это интерфейс, состоящий из двух (или одного для только для чтения) методов, обнародованных объектом, а именно методов getter и setter, в данном случае:

- (MyStruct) myStruct;
- (void) setMyStruct: (MyStruct) newMyStruct;

Нет смысла говорить о «получении адреса свойства».

Вы можете взять адрес переменной экземпляра (ivar). В этом случае у вас есть ивар под названием mystruct, и вы можете взять его адрес с помощью&mystruct в методе MyClass. Поскольку он отмечен@protected (по умолчанию), вы можете взять его адрес в подклассе, используя&self->mystruct, Если вы отметите это@public, затем вы можете взять его адрес, используя&myobj->mystruct, Это ужасная идея, и вы должны действительно переосмыслить это, но вы могли бы сделать это.

Если вы просто хотите, чтобы адрес ivar использовался для недолгой цели (например, если MyStruct был большим), вы могли бы сделать это, но это было бы очень необычно, и вам лучше было бы написать явно названный метод, например:

- (MyStruct*) getAddressForSettingMyStruct;

и если он только для чтения, еще лучше использовать const MyStruct *.

 20 авг. 2009 г., 01:01
Этот ответ отчасти снобистский. Будь милым

вам нужно написать метод, который возвращает указатель на эту переменную экземпляра.

- (void)getMyStructPointer:(MyStruct **)outStruct {
    *outstruct = &myStruct;
}

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

 14 сент. 2015 г., 16:58
может бытьsetMyStructPointer:?
 09 июл. 2009 г., 08:38
Если структура не очень большая; использование памяти потенциально может быть проблемой.

Ваш ответ на вопрос