objective c - NSMutableArray arrayWithArray compara lo mismo que NSArray mutableCopy?
objective-c ios6 (4)
No, el resultado de ellos es exactamente el mismo.
Solo la inicialización es diferente
Dado el siguiente ejemplo de código, ¿la variable newMutableArrray
diferente dependiendo de las dos inicializaciones diferentes, o lo mismo?
NSArray *originalArray = @[obj1, obj2, oj3];
NSMutableArray *newMutableArray = nil;
if (thereIsSomeDifference) {
newMutableArray = [NSMutableArray arrayWithArray:originalArray];
}
else {
newMutableArray = [originalArray mutableCopy];
}
Para responder, tenemos que definir "igualdad". Los dos inits uno al lado del otro darán lugar a colecciones diferentes, pero serán los mismos en la medida en que apuntan a los mismos elementos.
En otras palabras:
initA = [NSMutableArray arrayWithArray:originalArray];
initB = [originalArray mutableCopy];
if (initA == initB) {
// unreachable, because the pointers differ
}
// however
if ([initA isEqualToArray:initB]) {
// will be true
// because
for (int i=0; i<initA.count; i++) {
if ([initA objectAtIndex:i] == [initB objectAtIndex:i]) {
NSLog(@"this will log every element %@ in the arrays", [initA objectAtIndex:i]);
}
}
}
NO !!! Hay dos diferencias entre estas inicializaciones:
Recuento de retención: en el primer caso, obtiene un objeto liberado automáticamente, en el segundo caso, obtiene un objeto retenido, deberá liberarlo después (Esto no se aplica en ARC)
Si originalArray es nulo, en el primer caso, obtendrá una matriz mutable con 0 elementos; en el segundo caso, obtendrá nil (porque enviar un mensaje a nil devuelve cero). En su ejemplo, está claro que el Array original no es nulo, pero en la vida real puede llegar a este caso (Acabo de presentar el caso)
Una matriz es igual a otra matriz (isEqualToArray: selector) si tienen los mismos objetos (en el mismo orden). Esto se verifica usando el método isEqual: (sin tener en cuenta que la matriz es mutable o no).
Son lo mismo, una inicialización u otra no hace ninguna diferencia. Verifique que este registro sea el resultado de isEqualToArray:.
NSArray *originalArray = @[obj1, obj2, oj3];
NSMutableArray *newMutableArray = nil;
newMutableArray = [NSMutableArray arrayWithArray:originalArray];
thereIsSomeDifference= ![newMutableArray isEqualToArray: [originArray mutableCopy] ];
Tenga en cuenta que la comparación sería cierta incluso si la compara con una copia no mutable.