Al compilar con ARC, los argumentos del método a menudo parecen conservarse al principio del método y liberarse al final. Este par de retención/liberación parece superfluo, y contradice la idea de que ARC "produce el código que usted habría escrito de todos modos". Nadie en esos días oscuros anteriores al ARC realizó una retención/liberación extra en todos los argumentos del método solo para estar seguros, ¿o sí?¿Por qué ARC retiene los argumentos del método?
considerar:
@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
cuando se compila con Xcode 4.3.2 en modo de lanzamiento, el conjunto (de tal manera que soy capaz de entenderlo) contenía llamadas a objc_retain
y objc_release
al comienzo y al final de la segundo método. ¿Que esta pasando?
Esto no es un gran problema, pero este tráfico retenido/liberado adicional aparece cuando se utilizan instrumentos para perfilar código sensible al rendimiento. Parece que puedes decorar los argumentos del método con __unsafe_unretained
para evitar esta retención/liberación extra, como he hecho en el tercer ejemplo, pero hacerlo te parece bastante desagradable.
¿Alguna idea de por qué no ocurre en el primer ejemplo? – Thilo
Siempre puede verificar el código generado usando la vista del asistente de desmontaje. – Danra