Z ARC, już nie mogę rzucić CGColorRefsię id. Dowiedziałem się, że muszę wykonać obsadę z mostkiem. Według clang Docs :
Bridged obsada jest oddanych C-styl opatrzone jednym z trzech słów kluczowych:
(__bridge T) oprzutuje operand na typ docelowyT. JeśliTjest typem wskaźnika obiektu, który można przechowywać, toopmusi mieć typ wskaźnika, którego nie można przechowywać. JeśliTjest nieprzechowywalnym typem wskaźnika, to op musi mieć możliwy do utrzymania typ wskaźnika obiektu. W przeciwnym razie odlew jest źle uformowany. Nie ma przeniesienia własności, a ARC nie wprowadza żadnych operacji zachowania.
(__bridge_retained T) oprzutuje operand, który musi mieć typ wskaźnika obiektu, który można zachować, na typ docelowy, który musi być typem wskaźnika, którego nie można zachować. ARC zachowuje wartość, z zastrzeżeniem zwykłych optymalizacji wartości lokalnych, a odbiorca jest odpowiedzialny za zbilansowanie tego +1.
(__bridge_transfer T) oprzutuje operand, który musi mieć nieprzechowywalny typ wskaźnika, na typ docelowy, który musi być zachowanym typem wskaźnika obiektu. ARC zwolni wartość na końcu otaczającego pełnego wyrażenia, z zastrzeżeniem zwykłych optymalizacji wartości lokalnych.Rzuty te są wymagane do przenoszenia obiektów do i poza kontrolę ARC; zobacz uzasadnienie w sekcji dotyczącej konwersji zachowywalnych wskaźników obiektów.
Używanie odlewu
__bridge_retainedlub__bridge_transferwyłącznie do przekonania ARC do emitowania odpowiednio niezrównoważonego zatrzymania lub uwolnienia jest kiepską formą.
W jakich sytuacjach użyłbym każdego z nich?
Na przykład CAGradientLayerma colorswłaściwość, która akceptuje tablicę CGColorRefs. Domyślam się, że powinienem __brigetutaj użyć , ale dokładnie, dlaczego powinienem (lub nie powinienem), nie jest jasne.