Pregunta

NSData* bigData = ...
while(some condition) {
    NSData* smallData = [bigData subdataWithRange:...];
    //process smallData
}

Bajo arco, ¿debería seguir envolviendo un @autoreleasepool alrededor de while ¿condición?

NSData* bigData = ...
@autoreleasepool {
    while(some condition) {
        NSData* smallData = [bigData subdataWithRange:...];
        //process smallData
    }
}

La razón por la que pregunto es que veo que la asignación de vidas cuenta en instrumentos que pasan por el techo de mis objetos nsdata que invocan un dataWith... método en lugar de un initWith... método. Cuando uso initWith..., el recuento de asignación de vida es mucho, mucho menos.

¿Es mejor preferir el initWith... métodos siempre que sea posible?

¿Fue útil?

Solución

Otros consejos

Creo que su problema es que se supone que el grupo de autoresase debe ser en el interior el lazo. With the loop inside the autorelease block rather than vice-versa, the accumulated objects won't be released until after the loop finishes.

Bajo ARC, ¿debería seguir envolviendo un @AutoreleasePool alrededor de la condición de tiempo?

Sí. Las piscinas de autorlease todavía están en su lugar, y crecen y explotan como antes. El compilador solo agrega y fusiona las operaciones de retención y liberación necesarias cuando ARC está habilitado (Echoing Logan), en función de los métodos que son visibles para el TU y las convenciones de nombres predeterminadas.

La ejecución en ARC es casi idéntica al conteo de referencia manual: todavía existen pilas de piscinas de autorlease. Una diferencia es que el compilador puede ordenar las operaciones de conteo de referencia ligeramente diferentes de la forma en que lo escribió (no de manera incorrecta), y puede omitir los ciclos de retención innecesarios.

¿Es mejor preferir los métodos initwith siempre que sea posible?

WRT minimizando el crecimiento del montón en comparación con las contrapartes autoreladas: Sí. Ese siempre ha sido el caso. Es especialmente importante en los dispositivos iOS, donde la memoria es bastante limitada.

La excepción a esto es cuando el objeto puede evitar una asignación. Ejemplo:

NSString * copy = [NSString stringWithString:arg];

en este caso, copy quizás [[arg retain] autorelease]. Tenga en cuenta que en este caso, copy copy = [arg copy]...[arg release] aquí.

La otra ventaja es que sus desequilibrios de conteo de referencias a menudo se capturan antes cuando el objeto nunca se autorelará, y más cerca del sitio de llamadas (en lugar de cuando el grupo de autoresas finalmente se aparece).

El rendimiento con grandes piscinas de autoresas es en realidad mucho peor de lo que la mayoría de la gente supondría. Si puede evitar depender en gran medida de ellos (por ejemplo, usar alloc+init...+release autorelease Sobre ellos donde sea posible, y envuelva estas secciones en grupos de autoresas explícitos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top