Я пытаюсь определить, действителен ли объект. Программа имеет (по крайней мере) два потока, и один из потоков может привести к недействительности объекта, удалив его из NSMutableArray. Мне нужен другой поток, чтобы проверить его существование или действительность, прежде чем действовать на него.Указать, недействителен ли объект
ответ
Многопоточное программирование сложно. Hard не начинает фиксировать, насколько это сложно. Это тот тип, в котором общий, полезный, «разумно квалифицированный» способ детерминированного объединения двух разных чисел, которые мутируются и разделяются несколькими потоками в ограниченное время без использования какой-либо специальной помощи от CPU в форме атомных инструкций станет крупным прорывом и тезисом вашего доктора философии. Божество по вашему выбору публично поблагодарит вас за ваш вклад в человечество. Просто для добавления двух чисел вместе. На самом деле многопоточное программирование еще сложнее.
Посмотрите на: Technical Note TN2059 Using collection classes safely with multithreaded applications. Он охватывает эту тему в целом и описывает некоторые из неочевидных ловушек, которые ждут вас.
Вы говорите
мне нужен другой поток проверить либо его существование или действительность, прежде чем действовать на него.
Самый простой способ удержать индекс объекта в NSMutableArray, а затем выполните следующие действия
if(myObject == [myArray objectAtIndex: myObjectIndex]) {
// everything is good !
}
else {
// my object is not what I think it is anymore
}
Есть четкая проблема с этим подходом, однако
- вставки, и удаление наполнит вас
- Подход не является потокобезопасным, так как массив можно изменить, пока вы его читаете
Я действительно рекомендую использовать другой способ совместного использования этого массива между двумя потоками. Нужно ли это изменить? Если это не так, сделайте его неизменным, и вам больше не придется беспокоиться о проблемах с потоками. Если это так, то вам действительно нужно пересмотреть свой подход. Надеюсь, кто-то может дать какао-способ сделать это поточно-безопасным способом, поскольку у меня нет опыта.
Вы не можете. Единственный способ проверить, сохраняет ли ваш объект указатель объекта действительный объект, - это разыменовать его, но разыменование «недопустимого» объекта (по которому я предполагаю, что вы имеете в виду тот, который был отменен) приведет к доступу к памяти новый объект, который был выделен в том же месте, данные мусора, которые могут быть или не быть идентичными нормальному объекту, или страницу без памяти, которая приведет к немедленному EXEC_BAD_ACCESS.
Каждый раз, когда вы держите ссылку на объект, который вы можете использовать в будущем, вы должны его сохранить. Если вы этого не сделаете, вы не проявили никакого интереса или права собственности на объект, и система может выбросить его в любое время.
Использование объективных C-аксессуаров и свойств вместо прямой установки иголов и использования удержания/освобождения упрощает выполнение правильной вещи совсем немного.
У меня нет выбора, чтобы сохранить его. Один из потоков - это просто наблюдатель и не должен взаимодействовать с объектами. –
- 1. Объект основных данных недействителен
- 2. пожалуйста 00905 объект недействителен
- 3. Объект функции недействителен
- 4. Мембранный частичный объект недействителен
- 5. Может ли html указать объект JS
- 6. Объект удален или недействителен. (Realm)
- 7. NSArray, последний объект всегда недействителен
- 8. ModelState недействителен, объект в порядке?
- 9. Объект указать ошибку
- 10. Объект DataSource недействителен в Crystal Report
- 11. Ошибка: объект удален или недействителен. (Realm)
- 12. Область: Удалить и Добавить объект: объект удален или недействителен
- 13. Как проверить Swift, если объект недействителен?
- 14. Parse.com отношение объект указать заказ
- 15. Объект из результата сервиса всегда недействителен
- 16. Почему JavaScript-объект Date недействителен в Firefox?
- 17. Нокаут думает, что объект недействителен в IE8
- 18. Почему допустимый объект недействителен при получении активности?
- 19. Объект NSManagedObject с ID: [...] был недействителен
- 20. Ошибка 3420: объект недействителен или не установлен
- 21. Ошибка в процедуре Oracle, объект недействителен
- 22. Как проверить, недействителен ли сеанс
- 23. Проверьте, недействителен ли токен Ouath
- 24. Как указать *, который * член в структуре MIB_IPFORWARDROW недействителен?
- 25. CoreData Как указать на объект?
- 26. Как указать имя файла объект
- 27. указать объект на общедоступный метод
- 28. Obj-C - Можно ли указать на объект параметров которого модифицируется
- 29. Правильно ли это указать указатель на объект в функцию?
- 30. Как указать, будет ли объект JSON exsits в javascript?
Это абсолютно небезопасный. В промежутке между проверкой указателя и разыменованием его можно было удалить, и в любом случае он может сбой внутри вызовов массива, поскольку NSArray не является внутренне потокобезопасным и мутирует его из одного потока во время его чтения, что может привести к его сбою. –
Я согласен с Вашим комментарием, я добавлю его в мой ответ – hhafez
Интересно, имеет ли значение вопрос о том, является ли это * недействительным * и спрашивает, действительно ли это *. Возможно, я слишком глубоко задумываюсь? –