3

在 iOS 上独家使用 Objective-C 几年后,我最近一直在追赶我的 c++,而“新风格”c++ 上出现最多的话题是 RAII

为了确保我正确理解 RAII 概念,您是否将 Objective-C 延迟加载属性访问器视为一种 RAII?例如,检查以下访问方法

- (NSArray *)items {
    if(_items==nil) {
        _items=[[NSArray alloc] initWithCapacity:10];
    }
    return _items
}

这会被视为 RAII 的一个例子吗?如果没有,你能解释一下我错在哪里吗?

4

4 回答 4

4

不幸的是, RAII被广泛滥用。

Resources Acquisition Is Initialization最初的概念就是使用构造函数来保证事情的发生。在这个想法中:

std::fstream out("somefile.txt", "w");

应该保证如果out曾经创建过,那么该文件存在并且可以使用。

因此,延迟加载与 RAII 正好相反

注意:不过,如今,RAII 主要用于指代自动清理。一个例子是智能指针。这离最初的目标有点远。


关于清理,另一个成语是 SBRM for Scoped Bound Resources Management。但是,它并没有完全捕捉到确定性清理的概念。SBRM 的想法是保证当某个对象超出范围时将清理资源。这可以通过boost::scoped_ptr例如来实现。

但是,这无法捕获 a 的unique_ptr作用,因为您实际上可以returnaunique_ptr让资源逃脱它创建的范围!

于 2012-09-27T15:45:52.707 回答
3

虽然首字母缩略词命名为初始化,但成语的重点是破坏。Resource Acquisition Is Initialization更多的是关于Scoped Bound Resource Management,即让对象管理资源并在超出范围时将其清除。

于 2012-09-27T15:36:11.290 回答
2

一点都不。此外,通过“新型 C++”,您的意思是“至少在过去 15 年里,每个理智的人都在专门做这件事”。

RAII 涉及自动存储持续时间的对象,在它们的析构函数中清理动态对象,这些对象是它们拥有的。所有权的确切时间无关紧要。

于 2012-09-27T15:35:48.037 回答
0

不; RAII 是一些具有动态存储的对象被包装在具有自动存储的对象中,并在具有自动存储的对象被销毁时被销毁。

延迟加载(仅在您真正需要时才加载对象,而不是之前加载)和 RAII 并没有真正的关系。

于 2012-09-27T15:32:18.760 回答