在 iOS 上使用 Objective-C 几年之后,我最近一直在追赶我的 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 是将一些具有动态存储的对象包装在具有自动存储的对象中,并在具有自动存储的对象被销毁时被销毁。