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.