n.evermind
n.evermind

Reputation: 12004

How to delete in an NSMutableArray

I have an array which I store different classes which again hold different arrays. All arrays are defined as NSMutabelArrays.

When I want to delete an object in an array, my app crashes. This is my code:

NSLog(@"string to be deleted:%@", [[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabReference] objectAtIndex:tid]);
NSLog(@"string to be deleted:%@", [[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabColours] objectAtIndex:tid]);
NSLog(@"string to be deleted:%@", [[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabTitles] objectAtIndex:tid]);

[[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabReference] removeObjectAtIndex:tid];
[[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabColours] removeObjectAtIndex:tid];
[[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabTitles] removeObjectAtIndex:tid];

And this is the console output:

2011-05-01 22:03:40.788 M[61452:207] string to be deleted:2
2011-05-01 22:03:40.789 M[61452:207] string to be deleted:Orange
2011-05-01 22:03:40.791 M[61452:207] string to be deleted:Art
2011-05-01 22:03:40.806 M[61452:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array'

I don't really know what I'm doing wrong. There is obviously something in the array, so it shouldn't be 0. I mean it is the ONLY thing stored in the array at the moment, but that shouldn't be a problem, I guess?

I'd be very grateful for any help on this.


EDIT:

I think I haven't provided enough code. This is the method in which I set up myLibrary:

-(void) setupLibrary {

myLibrary = [[NSMutableArray alloc] init];

NoteBook *newNoteBook = [[NoteBook alloc] init];

newNoteBook.titleName = @"TEST";

NSMutableArray *ttArray = [[NSMutableArray alloc] init];
[ttArray addObject:@"Art"];

NSMutableArray *tcArray = [[NSMutableArray alloc] init];
[tcArray addObject:@"Orange"];

NSMutableArray *trArray = [[NSMutableArray alloc] init];
[trArray addObject: [NSNumber numberWithInteger:2]];

newNoteBook.tabTitles = ttArray;
newNoteBook.tabColours = tcArray;
newNoteBook.tabReference = trArray;

[myLibrary addObject:newNoteBook];
currentNoteBookNumber = 0;

[newNoteBook release];
[ttArray release];
[tcArray release];
[trArray release];

}

Now it appears that if I delete, for instance, one object in the tabTitles array (e.g. "Art"), I delete the entire newNoteBook object. I.e. once I delete a string in tabTitles, all other strings at the same position in tabColours or tabReference will be deleted as well. Why is this so?

The following code will crash after I successfully deleted the string @ position 0 in an array in my class which is stored in another array:

    NSLog(@"string deleted:%@", [[[self.myLibrary objectAtIndex:0] tabReference] objectAtIndex:0]);
[[[self.myLibrary objectAtIndex:0] tabReference] removeObjectAtIndex:0];

NSLog(@"string deleted:%@", [[[self.myLibrary objectAtIndex:0] tabColours] objectAtIndex:0]);
[[[self.myLibrary objectAtIndex:0] tabColours] removeObjectAtIndex:0];

Upvotes: 0

Views: 1701

Answers (2)

Cyprian
Cyprian

Reputation: 9453

Your error

-[NSMutableArray objectAtIndex:]: index 0 

is telling that you are trying to get an object at index 0 not that you want to remove it. So I think what you did is you called the method where you have your reading and removing code 2 times in a row. Try to see it that is the case.

Upvotes: 1

cweinberger
cweinberger

Reputation: 3588

Don't know what's the problem here, but you should consider to keep your arrays safe:

if([yourArray count] > tid) {
    [yourArray removeObjectAtIndex.tid;
}

Upvotes: 2

Related Questions