Доступ к элементам переменной экземпляра структуры в Objective-C с помощью геттера - PullRequest
3 голосов
/ 28 января 2012

У меня есть переменная экземпляра, которая представляет собой структуру, например:

struct Data {
    UInt32 i;
    UInt32 arr[1];
};

И в моем классе определено свойство:

@property struct Data data; // and the corresponding @synthesize in the imp file

Теперь я знаю, что изменениезначения i и arr через getter из data концептуально неверны, так как я буду получать доступ к копии data, возвращенной получателем (правильный способ доступа к нему с использованиемself->data).

Однако возникают некоторые общие вопросы Objective-C, касающиеся следующих строк:

self.data.i = 1;      // produces compile error        
self.data.arr[0] = 1; // compiles ok

Во-первых, почему первая строка вызывает ошибку компиляции, а вторая -не так?

Во-вторых, если синтаксис точки в приведенной выше строке (self.data) является просто синтаксическим сахаром для [self data], почему я получаю 2 разные (хотя и похожие) ошибки компиляции?1024 *

1 Ответ

5 голосов
/ 28 января 2012

На самом деле, структуры передаются по значению в C (и Цель C).Это означает, что ваше свойство фактически возвращает копию только для чтения (rvalue) внутреннего типа «Данные».Назначение относится к временной возвращенной копии, которую компилятор (по праву) помечает как немного подозрительную.

Вторая строка, которая правильно компилируется, делает это, так как self.data.arr возвращает UInt32 * только для чтения, но при индексированиис [0] и пишите в него, вы пишете не в указатель, а в память, на которую он указывает, что разрешено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...