reid55
reid55

Reputation: 169

How do I removeAllObjects on my NSMutableArray that is part of another object?

I have an object defined like this: Scores.h:

@interface Scores : NSObject {
NSString *sentenceKey;
    NSMutableArray *scorrectAnswers;
}
@property (nonatomic, copy) NSString *sentenceKey;
@property (nonatomic, copy) NSMutableArray *scorrectAnswers;
+ (id)addScore:(NSString *)senKey;

- (id)initWithSentenceKey:(NSString *)sKey  
    scorrectAnswers:(NSMutableArray *)scorrectAs;

- (id)initWithSentenceKey:(NSString *)sKey;
- (void)removeArrayObjects;

Score.m:

#import "Scores.h"
@implementation Scores

@synthesize sentenceKey, scorrectAnswers;

+ (id)addScore:(NSString *)senKey
{
Scores *newScore = [[self alloc] initWithSentenceKey:senKey
                    scorrectAnswers:[NSMutableArray new]];
return [newScore autorelease];}

I'm trying to removeAllObjects on my mutable array with this method:

- (void)removeArrayObjects;{
   [scorrectAnswers removeAllObjects];}

...which I call from another program like this:

for (Scores *sScore in scores)
{   
    [sScore removeArrayObjects];
}

... and I get this error when I run it:

-[__NSArrayI removeAllObjects]: unrecognized selector sent to instance 0x53412d0

Can anyone tell me what I'm doing wrong here? Thanks.

Upvotes: 2

Views: 6876

Answers (3)

Scott D
Scott D

Reputation: 1424

Similar to what was mentioned above, I had an NSMutableArray which was being re-allocated somewhere in my code as an NSArray. Once I modified that to correctly be an NSMutableArray, it resolved my problem.

I would suggest doing a quick search to ensure that you have not reallocated the array somewhere in your project and modify accordingly.

Upvotes: 0

Paul.s
Paul.s

Reputation: 38728

You are not dealing with an NSMutableArray as the error indicates you have an immutable NSArray.

This question may be your answer NSMutableArray addObject: -[__NSArrayI addObject:]: unrecognized selector sent to instance

Basically the copy you used when defining your @property will cause the setter to be generated using

scorrectAnswers = [newMutableArray copy];

which returns an immutable NSArray.

You can re-implement this method and change the previous line for:

scorrectAnswers = [newMutableArray mutableCopy];

or use retain instead of copy

This can also occur when getting data from a plist

If you are using a plist it will return an NSArray even if you save an NSMutableArray it will be cast. So when retrieving you will need to do something like:

scorrectAnswers = [[NSMutableArray alloc] initWithArray:[userDefault objectForKey:@"my_array_key"]]

Upvotes: 12

Seamus Campbell
Seamus Campbell

Reputation: 17916

It doesn't look like like the memory pointed to by scorrectAnswers is actually pointing to an NSMutableArray. Where and how do you initialize that variable? If you are setting the ivar directly with an autoreleased object, like:

scorrectAnswers = [NSMutableArray arrayWithCapacity:10];

then the autoreleased array will be destroyed, since you're not retaining it (or copying it). If that memory gets reallocated to point to another object, you'll see an error like the one you're getting, with an unexpected type. If the memory has not been reallocated, you'll get an EXC_BAD_ACCESS error.

Upvotes: 1

Related Questions