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.

questionAnswers(4)

yourAnswerToTheQuestion