Безопасное использование указателей в Objective-C - PullRequest
0 голосов
/ 17 февраля 2012

Допустим, у меня есть объект с целочисленными переменными экземпляра и 1 функцией-членом. Функция выполняется в отдельном потоке и постоянно обновляет значение переменной экземпляра. У меня есть вторая функция (часть другого класса), которая также выполняется в отдельном потоке, и требует доступа в реальном времени к переменной целочисленного экземпляра в первом объекте. Поэтому я передаю указатель на переменную экземпляра второй функции, а вторая функция просто разыменовывает указатель. Таким образом, вторая функция всегда имеет доступ к обновленному значению переменной экземпляра.

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

Mac OS X Snowleopard, Xcode 3.2.6. Objective-C с какао.

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

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Вы можете использовать систему типов здесь. Вместо того, чтобы иметь что-то вроде int*, вы можете иметь const int *, что означает, что это указатель на константу int. Можно обойти это, приведя обратно к (int *) внутри функции, но это является нарушением системы типов (отсюда явное приведение), и функции с хорошим поведением этого не сделают.

Обратите внимание, что вам также может понадобиться добавить volatile, если ваша функция должна убедиться, что она имеет актуальное значение. В противном случае компилятор может решить, что можно кэшировать результаты разыменования где-либо.

1 голос
/ 17 февраля 2012

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

Наконец, поскольку выПри доступе к свойству из более чем одного потока вам необходимо обеспечить некоторую синхронизацию, чтобы оба потока не пытались получить доступ к свойству одновременно.Самый простой способ сделать это - опустить «неатомный» (именно так большинство людей рефлексивно объявляет свои свойства) из объявления свойства, что приведет к тому, что средства доступа к свойствам становятся атомарными.Второй самый простой способ - использовать директиву @synchronized.

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