Dlaczego ARC zachowuje argumenty metody?
Podczas kompilacji za pomocą ARC argumenty metod często wydają się być zachowywane na początku metody i wypuszczane na końcu. Ta para zachowań / uwolnień wydaje się zbędna i zaprzecza idei, że ARC „produkuje kod, który i tak by napisał”. Nikt w tych ciemnych czasach przed ARC nie przeprowadził dodatkowego zatrzymania / wydania wszystkich argumentów metod, żeby być po bezpiecznej stronie, prawda?
Rozważać:
<code>@interface Test : NSObject @end @implementation Test - (void)testARC:(NSString *)s { [s length]; // no extra retain/release here. } - (void)testARC2:(NSString *)s { // ARC inserts [s retain] [s length]; [s length]; // ARC inserts [s release] } - (void)testARC3:(__unsafe_unretained NSString *)s { // no retain -- we used __unsafe_unretained [s length]; [s length]; // no release -- we used __unsafe_unretained } @end </code>
Po skompilowaniu z Xcode 4.3.2 w trybie wydania, zespół (taki, że jestem w stanie go zrozumieć) zawierał wywołaniaobjc_retain
iobjc_release
na początku i na końcu drugiej metody. Co się dzieje?
Nie jest to duży problem, ale ten dodatkowy ruch zachowujący / zwalniający pojawia się, gdy używamy Instrumentów do profilowania kodu wrażliwego na wydajność. Wygląda na to, że możesz udekorować argumenty metody__unsafe_unretained
aby uniknąć tego dodatkowego zatrzymania / wydania, jak zrobiłem w trzecim przykładzie, ale robi to dość obrzydliwie.