После нескольких лет эксклюзивной работы с Objective-C на iOS я догонял свой c ++, и тема, которая больше всего обсуждается в «новом стиле» c ++, — это RAII
Чтобы убедиться, что я правильно понимаю концепцию RAII, вы бы посчитали, что ленивый метод доступа к объектам Objective-C является типом RAII? Например, проверьте следующий метод доступа
- (NSArray *)items {
if(_items==nil) {
_items=[[NSArray alloc] initWithCapacity:10];
}
return _items
}
Будет ли это рассматриваться как пример RAII? Если нет, не могли бы вы объяснить, где я ошибаюсь?
RAII к сожалению, широко используется неправильно.
Начальная концепция Приобретение ресурсов — это инициализация было все об использовании конструкторов, чтобы гарантировать, что это произошло. В этой идее:
std::fstream out("somefile.txt", "w");
следует гарантировать, что если out
когда-либо создан, то файл существует и готов к использованию.
Следовательно, Ленивая Загрузка — противоположность RAII !
Примечание: в настоящее время RAII в основном используется для обозначения автоматическая очистка. Примером являются умные указатели. Это немного далеко от своей первоначальной цели.
Что касается очистки, еще одна идиома SBRM для Ограниченное управление ресурсами. Хотя это не полностью отражает идею детерминированной очистки. Идея SBRM заключается в том, что вы гарантируете, что ресурс будет очищен, когда определенный объект выходит из области видимости. Это может быть достигнуто через boost::scoped_ptr
например.
Однако это не может уловить, что unique_ptr
делает, так как вы можете на самом деле return
unique_ptr
тем самым позволяя ресурсу выходить за рамки, в которых он был создан!
В то время как акроним называет инициализацию, фокус идиомы — разрушение. Приобретение ресурсов — это инициализация больше о Ограниченное управление ресурсами, то есть объект управляет ресурсом и очищает его, когда он выходит из области видимости.
Нет, совсем нет. Кроме того, под «новым стилем C ++» вы подразумеваете «Все здравомыслящие люди делали это, по крайней мере, последние пятнадцать лет».
RAII вовлекает объекты автоматической длительности хранения, убирая динамические объекты в их деструкторе, которым они владеют. Точные сроки владения не имеют значения.
Нет; RAII — это когда некоторый объект, имеющий динамическое хранилище, помещается в объект (ы) с автоматическим хранением и уничтожается, когда объект (ы) с автоматическим хранением уничтожается.
Ленивая загрузка (загрузка объекта только тогда, когда вам это действительно нужно, а не раньше) и RAII на самом деле не связаны.