Core Foundation のメモリ管理の規則は、Cocoa の規則と似ています。参照を返すメソッドに「作成」または「コピー」という単語が含まれている場合、CFRelease()
その参照を所有しており、その参照を呼び出して所有権を放棄する必要があります。それ以外の場合は、参照を所有していないため、所有権を取得するために呼び出す必要があります (必然的に、その新しい所有権を放棄CFRetain
するために後続が必要になります)。CFRelease
これらのルールは、Core Foundation のメモリ管理プログラミング ガイドから抜粋したもので、次のとおりです。
- オブジェクトを (直接または別のオブジェクトのコピーを作成することによって) 作成すると、そのオブジェクトの所有者になります。
- 他の場所からオブジェクトを取得した場合、あなたはそれを所有していません。破棄されないようにしたい場合は、(CFRetain を使用して) 自分自身を所有者として追加する必要があります。
- オブジェクトの所有者である場合は、(CFRelease を使用して) オブジェクトの使用が終了したら、所有権を放棄する必要があります。
あなたの例では、 と の両方をリリースaddressBook
するpeopleArray
必要があります。Core Foundation には同等のものがないためautorelease
、メソッドから参照を返す場合は、配列を解放せずに返します。(悪意を持っていない限り) メソッド名に「create」を含めて、返されたオブジェクトへの参照を所有していることを呼び出し元に示す必要があります。この場合、CFArray は、NSCFArray
から継承する Objective-C オブジェクトである に無料でブリッジされNSObject
ます。したがって、関数/メソッドから返す必要がある場合はpeopleArray
、NSArray*
andにキャストできます。autorelease
return [(NSArray*)peopleArray autorelease];
これは、無料のブリッジ クラスでのみ機能することに注意してください。私の理解では、独自の無料のブリッジ クラスを作成するのはかなり難しく、プリミティブ (文字列、配列など) CF クラスのみが無料でブリッジされるため、このアプローチは常に機能するとは限りません。最後に、使用を避けることができればautorelease
(つまり、メモリ管理をより明示的にすることができれば)、それはおそらく常に良いことです。