我有一个像这样定义的对象: 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];}
我正在尝试使用此方法删除可变数组上的AllObjects:
- (void)removeArrayObjects;{
[scorrectAnswers removeAllObjects];}
...我从另一个程序中调用这个:
for (Scores *sScore in scores)
{
[sScore removeArrayObjects];
}
...我运行时遇到此错误:
- [__ NSArrayI removeAllObjects]:无法识别的选择器发送到实例0x53412d0
谁能告诉我这里我做错了什么?感谢。
答案 0 :(得分:12)
您没有处理NSMutableArray
,因为错误表明您有一个不可变的NSArray
。
这个问题可能就是您的回答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"]]
答案 1 :(得分:1)
它看起来不像scorrectAnswers
指向的内存实际指向NSMutableArray
。您在何处以及如何初始化该变量?如果您使用自动释放的对象直接设置ivar,例如:
scorrectAnswers = [NSMutableArray arrayWithCapacity:10];
然后自动释放的数组将被销毁,因为你没有保留它(或复制它)。如果该内存被重新分配以指向另一个对象,您将看到类似于您获得的错误,具有意外类型。如果尚未重新分配内存,则会出现EXC_BAD_ACCESS错误。
答案 2 :(得分:0)
与上面提到的类似,我有一个NSMutableArray,它在我的代码中作为NSArray被重新分配。一旦我将其修改为正确的NSMutableArray,它就解决了我的问题。
我建议快速搜索以确保您没有在项目中的某个位置重新分配数组并进行相应的修改。