Czy ARC działa z podstawowymi obiektami graficznymi?

Niedawno rozpocząłem nowy projekt przy użyciu automatycznego zliczania referencji (ARC).
Kiedy przypisałem treść Kalajera:

UIView* view = ...
UIImage* image = ...
view.layer.contents = image.CGImage

I got an error

Niejawna konwersja wskaźnika innego niż Objective-C Typu 'CGImageRef' na 'id' jest wyłączona z ARC

Po prostu rzut CGImageRef na id ukrywa błąd, ale zastanawiałem się, czy łuk nadal działa poprawnie?

Author: Brad Larson, 2011-10-17

3 answers

Naprawdę powinieneś sprawdzić Filmy ARC z WWDC 2011. Są one dostępne na stronie dewelopera i otwarte przez iTunes. Szczególnie:

• Sesja 323-Wprowadzenie Automatycznego Zliczania Referencji

• sesja 322-Objective-C Advancements in Depth

Również uwagi do ARC:

Https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

Both the uwagi referencyjne i filmy omawiają podstawowe grafiki (i in.) oraz sposób ich pracy z ARC.

W szczególności spójrz na sekcję o nazwie "Zarządzanie bezpłatnym mostem"

W wielu aplikacjach Cocoa trzeba używać obiektów w stylu Core Foundation, czy to z samego frameworka Core Foundation (np. CFArrayRef lub cfmutabledictionaryref) lub z ram, które przyjmują Podstawowe konwencje fundamentowe, takie jak Core Graphics (można użyć typów jak CGColorSpaceRef i CGGradientRef).

Kompilator nie zarządza automatycznie żywotnością rdzenia Obiektów Fundacji; należy wywołać CFRetain i CFRelease (lub odpowiednich wariantów specyficznych dla danego typu) podyktowanych przez rdzeń Podstawowe zasady zarządzania pamięcią (patrz Programowanie zarządzania pamięcią Przewodnik dla Core Foundation).

Jeśli rzucasz między obiektami Objective-C i Core Foundation, trzeba powiedzieć kompilatorowi o semantyce własności obiektu za pomocą odlewu (zdefiniowanego w objc / runtime.h) lub rdzeń Makro w stylu Foundation (zdefiniowane w NSObject.h): [...]

Jörg Jacobsen ma również dobry przegląd opcji pomostowych: Zarządzanie bezpłatnymi pomostami w środowisku ARC'ed .

__bridge_retained (N. b.: używać go tylko podczas przerzucania ze wskaźnika obiektu na wskaźnik typu C): i (programista) musi odwoływać się do tego obiektu od pewnego czasu w ciemnym świecie wskaźników typu C, który jest nieprzezroczysty do ty, ARC. Więc proszę, proszę nie zwalniać tego obiektu, dopóki ja nadal potrzebuję tego. Ja (programista) obiecuję, że sam go wydam (w ciemności world) when I ' m done with it

__bridge_transfer (N. b.: używaj go tylko podczas przerzucania ze wskaźnika typu C do wskaźnika obiektu): i (programista) hand over to you, ARC, an obiekt, który posiadam i który nie interesuje mnie już w ciemności świat wskaźników typu C, który jest dla Ciebie nieprzezroczysty. Ilekroć TY, ARC, jesteś zrób to sam., bo wiesz, że odpowiedni czas, a tym samym zaoszczędzić mi trochę pracy, nie musi to robić sam.

__bridge: ARC, ty balansujesz swoje zachowanie i uwalnianie, a ja balansuję swoje w mrocznym świecie wskaźników typu C, które jest.... Kiedykolwiek będę musiał trzymać się przedmiotu w mrocznym świecie. zachowaj to sam i uwolnij, gdy będzie to stosowne. I don ' t need any dodatkowy kontrakt z Tobą, ARC.

 43
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Pomimo odniesień wskazanych przez Steve ' a, uważam, że sprawa, którą pokazałeś powyżej, może być wyjątkowa. Z przejścia do notatek do wydania ARC , zwróć uwagę na sekcję "kompilator obsługuje obiekty CF zwrócone z metod Cocoa":

Kompilator rozumie metody Objective-C, które zwracają Rdzeń Typy fundamentów są zgodne z historycznymi konwencjami nazewnictwa kakao (zobacz Advanced Memory Management Programming Guide). Na przykład kompilator wie, że w iOS, cgcolor zwracany przez CGColor metoda UIColor nie jest własnością.

Podany przez nich przykład kodu:

gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
                                                 (id)[[UIColor lightGrayColor] CGColor], nil];

Opiera się na znanym zwracaniu CGColors z tych metod (brakuje im cast to id, które dodałem w powyższym kodzie, co powinno być wkrótce poprawione w ich dokumentacji).

Ponieważ [image CGImage] stosuje się do konwencji nazewnictwa, wierzę, że CGImage będzie tutaj poprawnie pomostowany. Myślę, że Twoja Obsada do id powinna być wszystkim, czego potrzebujesz proszę.

 8
Author: Brad Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-08 21:27:51

Jedna popularna odpowiedź na layer.contents = (id)image.CGImage pytanie to layer.contents = obj_unretainedObject(image.CGImage).

I do =(__bridge id)image.CGImage.

 4
Author: debleek63,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-25 12:04:48