2012-09-28 15 views
12

Duplicar posibles:
Is literal creation of an NSMutableDictionary less efficient than the class helper method?Creación de un NSMutableArray con un literal a través de mutableCopy o arrayWithArray:

Según el video WWDC que introduce literales objectivec, NSMutableArray s se puede inicializar este modo:

[NSMutableArray arrayWithArray:@[]]; 

pero ¿y si tuviéramos que hacerlo como t su:

[@[] mutableCopy]; 

Yo sé que uno se está inicializando la matriz, y el otro es sólo proporcionar una copia superficial; por lo tanto, la gestión de la memoria es diferente. Pero si estamos usando ARC, ¿cuáles son las desventajas de usar este último? ¿Es más caro? ARC probablemente maneje ambos de manera diferente, pero me pregunto si usar mutableCopy es 'peor' o no.

+1

¿Qué pasa con '[NSMutableArray array]'? –

Respuesta

5

En el primer caso, termina con dos objetos agregados al grupo de autorrelease actual: el literal NSArray y el NSMutableArray que está creando a partir de él. En este último, el NSArray literal se agrega al grupo de autorrelease pero el NSMutableArray copiado de él no. Entonces, el primer caso es ligeramente peor, en cuanto al rendimiento, ya que agotar el grupo de autorrelease (por ejemplo, al final del ciclo de ciclo de ejecución) requiere liberar ambos objetos en sucesión, mientras que en el segundo caso la copia se publicará por separado del literal autorellenado. En la práctica, la diferencia de tiempo será infinitesimal.

+0

¡muy interesante! eso explica mucho. Gracias. – KDaker

+5

Bajo ARC, las autorreleases innecesarias a menudo se optimizan, por lo que incluso eso probablemente no sea una preocupación importante. –

+0

Ese no es necesariamente el caso. La última vez que probé, la Fundación no parecía estar compilada con ARC. Esto es importante, porque al compilar con ARC, clang no inserta 'return [retVal autorelease];' - en realidad inserta 'return objc_autoreleaseReturnValue (retVal);'. Del mismo modo, quien llama (su código) no llama '-retain' al resultado, sino que llama a' objc_retainAutoreleasedReturnValue'. La combinación de estas dos funciones alrededor de ese método devuelve resultados en el objeto que nunca entra realmente en el grupo de autorrelease. De lo contrario, todavía termina allí. –

Cuestiones relacionadas