Apakah saya pemilik objek yang dikembalikan oleh AudioSessionGetProperty?

Metode ini memiliki nama "Dapatkan" dan tidak mengembalikan sesuatu melalui return. Dibutuhkan sebuah pointer misalnya ke CFStringRef, seperti ini:

CFStringRef outValue;
UInt32 propertySize = sizeof(outValue);
AudioSessionGetProperty(propertyID, &propertySize, &outValue);

Dokumentasi mengatakan bahwa fungsi "menyalin" nilai ke dalam penunjuk outValue yang disediakan.

Jadi ini membuat objek dengan jumlah retensi +1, dan saya bertanggung jawab untuk melepaskan/membebaskan data itu?


person openfrog    schedule 12.01.2012    source sumber


Jawaban (1)


Menurut dokumentasi untuk AudioSessionGetProperty, ini bergantung pada apakah properti yang Anda dapatkan adalah tipe C atau nilai fondasi inti:

Beberapa nilai properti Core Audio adalah tipe C dan lainnya adalah objek Core Foundation:

Jika Anda memanggil fungsi ini untuk mengambil nilai yang merupakan objek Core Foundation, maka fungsi ini—meskipun menggunakan “Dapatkan” dalam namanya—menduplikasi objek tersebut. Anda bertanggung jawab untuk melepaskan objek, seperti yang dijelaskan dalam “Aturan Pembuatan” di Panduan Pemrograman Manajemen Memori untuk Core Foundation.

Jadi jika yang Anda dapatkan adalah nilai properti fondasi inti, Anda harus memastikan untuk melepaskan objek yang dihasilkan.

Perhatikan bahwa menggunakan ARC tidak akan secara otomatis mengatasi masalah ini untuk Anda. Dari panduan pemrograman ARC:

Di banyak aplikasi Kakao, Anda perlu menggunakan objek bergaya Core Foundation, baik dari kerangka Core Foundation itu sendiri (seperti CFArrayRef atau CFMutableDictionaryRef) atau dari kerangka kerja yang mengadopsi konvensi Core Foundation seperti Core Graphics (Anda mungkin menggunakan tipe seperti CGColorSpaceRef dan CGGradientRef ).

Kompiler tidak secara otomatis mengatur masa hidup objek Core Foundation; Anda harus memanggil CFRetain dan CFRelease (atau varian spesifik tipe terkait) sebagaimana ditentukan oleh aturan manajemen memori Core Foundation (lihat Panduan Pemrograman Manajemen Memori untuk Core Foundation).

Jika Anda melakukan cast antara objek bergaya Objective-C dan Core Foundation, Anda perlu memberi tahu kompiler tentang semantik kepemilikan objek menggunakan cast (didefinisikan dalam objc/runtime.h) atau makro gaya Core Foundation (didefinisikan dalam NSObjek.h):

person Tim Dean    schedule 12.01.2012