2011-08-24 43 views
2

我有一个这样定义的对象:如何在我的NSMutableArray上移除另一个对象的一部分的所有对象?

#import "Scores.h" 
@implementation Scores 

@synthesize sentenceKey, scorrectAnswers; 

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

我想removeAllObjects我用这种方法可变数组:

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

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

...我从另一个程序调用这样的电话:

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

...当我运行它,我得到这个错误:

- [__ NSArrayI removeAllObjects]:无法识别的选择发送到实例0x53412d0

谁能告诉我,我做错了什么吗?谢谢。

回答

12

由于错误表明您有不可变的NSArray,因此您没有处理NSMutableArray

这个问题可能是你的答案NSMutableArray addObject: -[__NSArrayI addObject:]: unrecognized selector sent to instance

基本上copy您在定义@property时将导致使用

scorrectAnswers = [newMutableArray copy]; 

它返回一个不可改变NSArray生成二传手使用。

可以重新实现此方法,改变以前行:

scorrectAnswers = [newMutableArray mutableCopy]; 

或使用retain代替copy

这也可以从一个plist

如果获取数据时发生你正在使用一个plist它会返回一个NSArray,即使你保存了一个NSMutableArray它将被施放。所以,当检索,你需要做这样的事情:

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

感谢您非常有帮助的回应。我没有使用plist。这是我如何创建我的数组:[sentenceScore setScorrectAnswers:correctAnswers]。所以,如果我使用保留的副本,而不是在我的@property声明中,你认为这将解决我的问题? – reid55

+0

它应该做的,但如果这是你打算采取'copy'那么你应该考虑把它当作'copy'但使用自己实现二传手'mutableCopy' –

+0

为我工作。谢谢!! –

1

它看起来不像scorrectAnswers指向的内存实际上指向NSMutableArray。你在哪里以及如何初始化该变量?如果直接用自动释放的对象设置伊娃,如:

scorrectAnswers = [NSMutableArray arrayWithCapacity:10]; 

则自动释放的阵列将被破坏,因为你不保留它(或复制它)。如果该内存被重新分配以指向另一个对象,则会看到类似于您正在获取的错误的意外类型的错误。如果内存没有被重新分配,你会得到一个EXC_BAD_ACCESS错误。

+0

我不知道这是一个'autorelease'问题,但我没想到它因为缺乏使用getter/setter方法 –

0

什么上面所提到的一样,我有一个NSMutableArray它正在某处在我的代码作为一个NSArray重新分配。一旦我修改它正确地成为一个NSMutableArray,它解决了我的问题。

我建议做一个快速搜索,以确保你有没有在你的项目重新分配数组的地方,并进行相应的修改。

相关问题