在iOS上使用了几年独有的Objective-C之后,我最近一直在追赶我的c ++,而关于“新风格”c ++的话题最多的是RAII
为了确保我正确理解RAII概念,您会认为Objective-C延迟加载属性访问器是一种RAII吗?例如,请检查以下访问方法
- (NSArray *)items {
if(_items==nil) {
_items=[[NSArray alloc] initWithCapacity:10];
}
return _items
}
这会被视为RAII的一个例子吗?如果没有,你能解释一下我错在哪里吗?
答案 0 :(得分:4)
RAII 不幸被广泛滥用。
最初的概念资源获取是初始化就是使用构造函数来保证事情的发生。在这个想法:
std::fstream out("somefile.txt", "w");
应该保证如果创建了out
,那么该文件就存在并且可以使用了。
因此,延迟加载与RAII相反!
注意:现在,RAII主要用于指代自动清理。一个例子是智能指针。它距离最初的目标有点远。
关于清理,另一个成语是 Scoped Bound Resources Management 的SBRM。但它并没有完全捕捉到确定性清理的想法。 SBRM的想法是保证在某个对象超出范围时清理资源。例如,这可以通过boost::scoped_ptr
来实现。
然而,这无法捕获unique_ptr
的作用,因为您实际上可以return
unique_ptr
,从而让资源逃脱它在其中创建的范围!
答案 1 :(得分:3)
虽然首字母缩略词名称初始化,但成语的焦点是破坏。 资源获取是初始化更多地是关于范围绑定资源管理,即让对象管理资源并在超出范围时清除它。
答案 2 :(得分:2)
不,一点也不。此外,通过“新式C ++”,你的意思是“至少在过去的十五年里,每个人都做到了这一点。”
RAII涉及自动存储持续时间的对象,清除它们拥有的析构函数中的动态对象。所有权的确切时间无关紧要。
答案 3 :(得分:0)
没有; RAII是一些具有动态存储的对象被包装在具有自动存储的对象中的地方,并且当具有自动存储的对象被破坏时被销毁。
延迟加载(仅在您真正需要时加载对象,而不是之前加载对象)和RAII并不真正相关。