Z ARC, już nie mogę rzucić CGColorRef
się 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) op
rzutuje operand na typ docelowyT
. JeśliT
jest typem wskaźnika obiektu, który można przechowywać, toop
musi mieć typ wskaźnika, którego nie można przechowywać. JeśliT
jest 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) op
rzutuje 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) op
rzutuje 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_retained
lub__bridge_transfer
wyłą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 CAGradientLayer
ma colors
właściwość, która akceptuje tablicę CGColorRef
s. Domyślam się, że powinienem __brige
tutaj użyć , ale dokładnie, dlaczego powinienem (lub nie powinienem), nie jest jasne.