Với ARC, tôi không còn có thể đúc CGColorRef
đến id
. Tôi đã học được rằng tôi cần phải thực hiện một dàn diễn viên bắc cầu. Theo tài liệu clang :
Một dàn diễn viên cầu nối được một dàn diễn viên C-phong cách chú thích với một trong ba từ khóa:
(__bridge T) op
chuyển toán hạng sang kiểu đíchT
. NếuT
là một loại con trỏ đối tượng có thể giữ lại, thìop
phải có một loại con trỏ không thể giữ lại. NếuT
là một loại con trỏ không thể giữ lại, thì op phải có một loại con trỏ đối tượng có thể giữ lại. Nếu không, các diễn viên là không thành hình. Không có chuyển quyền sở hữu và ARC không chèn hoạt động.
(__bridge_retained T) op
đưa toán hạng, phải có loại con trỏ đối tượng có thể giữ lại, đến loại đích, phải là loại con trỏ không thể giữ lại. ARC giữ lại giá trị, tuân theo các tối ưu hóa thông thường trên các giá trị cục bộ và người nhận có trách nhiệm cân bằng +1 đó.
(__bridge_transfer T) op
đưa toán hạng, phải có loại con trỏ không thể giữ lại, đến loại đích, phải là loại con trỏ đối tượng có thể giữ lại. ARC sẽ giải phóng giá trị ở cuối biểu thức đầy đủ kèm theo, tuân theo các tối ưu hóa thông thường trên các giá trị cục bộ.Các phôi này được yêu cầu để chuyển các đối tượng vào và ra khỏi điều khiển ARC; xem cơ sở lý luận trong phần chuyển đổi các con trỏ đối tượng có thể giữ lại.
Sử dụng một
__bridge_retained
hoặc__bridge_transfer
đúc hoàn toàn để thuyết phục ARC phát ra một giữ lại hoặc phát hành không cân bằng, tương ứng, là hình thức kém.
Trong những tình huống tôi sẽ sử dụng từng loại?
Ví dụ, CAGradientLayer
có một thuộc colors
tính chấp nhận một mảng CGColorRef
s. Tôi đoán là tôi nên sử dụng __brige
ở đây, nhưng chính xác lý do tại sao tôi nên (hoặc không nên) không rõ ràng.