2009-11-13 18 views

Respuesta

118

NSArray no se puede modificar, es decir, no se puede modificar. Deberías echar un vistazo al NSMutableArray. Confirmar la sección "Extracción de Objetos", usted encontrará que hay muchas funciones que le permiten eliminar elementos:

[anArray removeObjectAtIndex: index]; 
[anArray removeObject: item]; 
[anArray removeLastObject]; 
+3

Nota: [-removeObject:] (https : //developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/NSMutableArray_Class/Reference/Reference.html#//apple_ref/oc c/instm/NSMutableArray/removeObject :) elimina ** todas las coincidencias ** en la matriz. – Pang

23
NSMutableArray *arrayThatYouCanRemoveObjects = [NSMutableArray arrayWithArray:your_array]; 

[arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index]; 

[your_array release]; 

your_array = [[NSArray arrayWithArray: arrayThatYouCanRemoveObjects] retain]; 

eso es todo

si no propia your_array (es decir, se autoreleased) eliminar la versión & conservar mensajes

20

Esta categoría puede ser de su gusto. ¡Pero! Sé frugal con su uso; ya que estamos convirtiendo a NSMutableArray y viceversa, no es para nada eficiente.

@implementation NSArray (mxcl) 

- (NSArray *)arrayByRemovingObject:(id)obj 
{ 
    if (!obj) return [self copy]; // copy because all array* methods return new arrays 
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:self]; 
    [mutableArray removeObject:obj]; 
    return [NSArray arrayWithArray:mutableArray]; 
} 

@end 
+1

eres un campeón! Tuve que usar el método anterior porque ordené un NSMutableArray, lo que significa que el arreglo que uso en las celdas de mi tabla no es mutable. Por lo tanto, cuando voy a eliminar objetos de la matriz, utilizo su método para hacerlo. – fuzz

2

Hizo una categoría como mxcl, pero esto es un poco más rápido.

Mi prueba muestra ~ 15% de mejora (podría estar equivocado, no dude en comparar los dos).

Básicamente tomo la parte de la matriz que está delante del objeto y la parte de atrás y los combino. Por lo tanto, excluyendo el elemento.

- (NSArray *)prefix_arrayByRemovingObject:(id)object 
{ 
    if (!object) { 
     return self; 
    } 

    NSUInteger indexOfObject = [self indexOfObject:object]; 
    NSArray *firstSubArray = [self subarrayWithRange:NSMakeRange(0, indexOfObject)]; 
    NSArray *secondSubArray = [self subarrayWithRange:NSMakeRange(indexOfObject + 1, self.count - indexOfObject - 1)]; 
    NSArray *newArray = [firstSubArray arrayByAddingObjectsFromArray:secondSubArray]; 

    return newArray; 
} 
+0

'NSArray * newArray = [NSArray array];' la inicialización aquí es redundante – Ossir

+0

¿Qué pasa si obj es nulo? –

+1

@Ossir Tienes razón, la declaración es redundante porque la parte '[self subarray ...]'. @Michael Ozeryansky, si el obj es nulo, 'indexOfObject' devolverá' NSNotFound'. No estoy seguro de lo que sucede entonces, pero probablemente no sea lo correcto, ¡gracias! – jmathew

16

Aquí es un enfoque más funcional utilizando valor-clave de codificación:

@implementation NSArray (Additions) 

- (instancetype)arrayByRemovingObject:(id)object { 
    return [self filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF != %@", object]]; 
} 

@end 
+0

¡listo! Gracias por compartir. – KPM

3

Retire Object de NSArray con este método:

-(NSArray *) removeObjectFromArray:(NSArray *) array withIndex:(NSInteger) index { 
    NSMutableArray *modifyableArray = [[NSMutableArray alloc] initWithArray:array]; 
    [modifyableArray removeObjectAtIndex:index]; 
    return [[NSArray alloc] initWithArray:modifyableArray]; 
} 
Cuestiones relacionadas