Dengan ARC, saya tidak bisa lagi dilemparkan CGColorRef
ke id
. Saya belajar bahwa saya perlu melakukan pemeran penghubung. Menurut dentang dokumen :
Pemain yang dijembatani adalah pemain gaya-C yang diberi anotasi dengan salah satu dari tiga kata kunci:
(__bridge T) op
melemparkan operan ke tipe tujuanT
. JikaT
adalah tipe pointer objek yang dapat dipertahankan, makaop
harus memiliki tipe pointer yang tidak dapat dipertahankan. JikaT
adalah tipe pointer yang tidak dapat dipertahankan, maka op harus memiliki tipe pointer objek yang dapat dipertahankan. Kalau gips tidak terbentuk dengan baik. Tidak ada transfer kepemilikan, dan ARC memasukkan tidak ada operasi penahanan.
(__bridge_retained T) op
melemparkan operan, yang harus memiliki jenis penunjuk objek yang dapat dipertahankan, ke jenis tujuan, yang harus merupakan jenis penunjuk yang tidak dapat dipertahankan. ARC mempertahankan nilainya, tunduk pada optimasi yang biasa dilakukan pada nilai-nilai lokal, dan penerima bertanggung jawab untuk menyeimbangkan +1 tersebut.
(__bridge_transfer T) op
melemparkan operan, yang harus memiliki jenis penunjuk yang tidak dapat dipertahankan, ke jenis tujuan, yang harus merupakan jenis penunjuk objek yang dapat dipertahankan. ARC akan merilis nilai pada akhir ekspresi penuh terlampir, tunduk pada optimasi biasa pada nilai-nilai lokal.Gips ini diperlukan untuk mentransfer objek masuk dan keluar dari kontrol ARC; lihat alasan di bagian tentang konversi pointer objek yang dapat dipertahankan.
Menggunakan
__bridge_retained
atau__bridge_transfer
melemparkan murni untuk meyakinkan ARC untuk memancarkan masing-masing mempertahankan atau melepaskan tidak seimbang, adalah bentuk yang buruk.
Dalam situasi apa saya akan menggunakan masing-masing?
Misalnya, CAGradientLayer
memiliki colors
properti yang menerima array CGColorRef
s. Dugaan saya adalah bahwa saya harus menggunakan di __brige
sini, tetapi mengapa saya harus (atau tidak seharusnya) tidak jelas.