Спросить, является ли объект недействительным - PullRequest
0 голосов
/ 20 июля 2009

Я пытаюсь определить, является ли объект действительным. Программа имеет (как минимум) два потока, и один из потоков может сделать объект недействительным, удалив его из NSMutableArray. Мне нужен другой поток, чтобы проверить его существование или действительность, прежде чем действовать на него

Ответы [ 3 ]

2 голосов
/ 20 июля 2009

Вы не можете. Единственный способ проверить, является ли память, указатель вашего объекта, по-прежнему представляет действительный объект, - это разыменовать его, но разыменование «недопустимого» объекта (под которым я предполагаю, что вы имеете в виду тот, который был освобожден) приведет к любому доступу к памяти новый объект, который был размещен в том же месте, мусорные данные, которые могут или не могут быть идентичны нормальному объекту, или не отображенная страница памяти, которая приведет к немедленному EXEC_BAD_ACCESS.

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

Использование аксессоров и свойств target C вместо прямой установки ivars и использование retain / release значительно упрощает правильное выполнение действий.

1 голос
/ 20 июля 2009

Многопоточное программирование сложно. Тяжело не начинает постигать, насколько это сложно. Это тот тип жесткого, в котором общий, полезный, «разумно квалифицированный» способ детерминированного сложения двух разных чисел, которые изменяются и совместно используются несколькими потоками в ограниченное время, без использования какой-либо специальной помощи от ЦП в форме атомных инструкций было бы крупным прорывом и диссертацией вашего доктора философии. Божество по вашему выбору публично поблагодарит вас за ваш вклад в человечество. Просто для сложения двух чисел. На самом деле, многопоточное программирование еще сложнее.

Посмотрите на: Техническое примечание TN2059 Безопасное использование классов коллекции в многопоточных приложениях . Он охватывает эту тему в целом и описывает некоторые неочевидные подводные камни, которые вас ожидают.

0 голосов
/ 20 июля 2009

Вы говорите

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

Самый простой способ - это удерживать индекс объекта в NSMutableArray, а затем выполнить следующее

if( myObject == [myArray objectAtIndex: myObjectIndex] ) {

   // everything is good !
}
else {
   // my object is not what I think it is anymore
}

Однако при таком подходе есть явная проблема

  1. вставка, и удаление набьет вас
  2. Подход не является потокобезопасным, так как массив может быть изменен во время его чтения

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

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