Por que o ARC retém os argumentos do método?

Ao compilar com o ARC, os argumentos do método geralmente parecem ser retidos no início do método e liberados no final. Este par de retenção / liberação parece supérfluo e contradiz a idéia de que o ARC "produz o código que você teria escrito de qualquer maneira". Ninguém naqueles dias escuros pré-ARC realizou uma retenção extra / liberação em todos os argumentos do método apenas para estar no lado seguro, não é?

Considerar:

<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>

Quando compilado com o Xcode 4.3.2 no modo de liberação, o assembly (de forma que eu possa entendê-lo) continha chamadas paraobjc_retain eobjc_release no início e no final do segundo método. O que está acontecendo?

Este não é um grande problema, mas esse tráfego extra de retenção / liberação aparece ao usar o Instruments para criar um perfil de código sensível ao desempenho. Parece que você pode decorar argumentos de método com__unsafe_unretained para evitar essa retenção / liberação extra, como eu fiz no terceiro exemplo, mas isso parece bastante repugnante.

questionAnswers(4)

yourAnswerToTheQuestion