如何删除作为另一个对象一部分的NSMutableArray上的AllObjects?

rei*_*d55 2 iphone nsmutablearray

我有一个像这样定义的对象: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;
Run Code Online (Sandbox Code Playgroud)

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];}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用此方法删除可变数组上的AllObjects:

- (void)removeArrayObjects;{
   [scorrectAnswers removeAllObjects];}
Run Code Online (Sandbox Code Playgroud)

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

for (Scores *sScore in scores)
{   
    [sScore removeArrayObjects];
}
Run Code Online (Sandbox Code Playgroud)

...当我运行它时,我收到此错误:

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

谁能告诉我这里我做错了什么?谢谢.

Pau*_*l.s 12

你没有处理一个NSMutableArray错误表明你有一个不可变的NSArray.

这个问题可能是你的答案NSMutableArray addObject: - [__ NSArrayI addObject:]:无法识别的选择器发送到实例

基本上,copy您在定义@property遗嘱时使用会导致使用生成setter

scorrectAnswers = [newMutableArray copy];
Run Code Online (Sandbox Code Playgroud)

返回一个不可变的NSArray.

您可以重新实现此方法并更改上一行:

scorrectAnswers = [newMutableArray mutableCopy];
Run Code Online (Sandbox Code Playgroud)

或使用retain而不是copy

从a获取数据时也会发生这种情况 plist

如果你正在使用plist它,它将返回一个NSArray即使你保存NSMutableArray它将被施放.因此,在检索时,您需要执行以下操作:

scorrectAnswers = [[NSMutableArray alloc] initWithArray:[userDefault objectForKey:@"my_array_key"]]
Run Code Online (Sandbox Code Playgroud)