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は広く誤用されています。

最初のコンセプトであるResourcesAcquisitionIsInitializationは、コンストラクターを使用して物事が発生したことを保証することでした。このアイデアでは:

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

outが作成された場合、ファイルが存在し、使用できる状態になっていることを保証する必要があります。

したがって、遅延読み込みはRAIIの反対です

注:ただし、最近では、RAIIは主に自動クリーンアップを指すために使用されます。例はスマートポインタです。当初の目標からは少し遠いです。


クリーンアップに関して、もう1つのイディオムはスコープ付きバウンドリソース管理用のSBRMです。ただし、決定論的なクリーンアップの概念を完全には捉えていません。SBRMの考え方は、特定のオブジェクトがスコープ外になったときにリソースがクリーンアップされることを保証することです。boost::scoped_ptrこれは、たとえば、によって達成できます。

ただし、unique_ptr実際にはリソースを作成されたスコープからエスケープさせることreturnができるため、これは何をするかをキャプチャできません。unique_ptr

于 2012-09-27T15:45:52.707 に答える
3

頭字語は初期化を指していますが、イディオムの焦点は破壊です。Resource Acquisition Is Initializationは、スコープバウンドリソース管理に関するものです。つまり、オブジェクトにリソースを管理させ、スコープ外になったときにリソースをクリアします。

于 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 に答える