Iphone 如何移除属于另一个对象的NSMutableArray上的AllObject?
我有一个对象定义如下: 分数。h:Iphone 如何移除属于另一个对象的NSMutableArray上的AllObject?,iphone,nsmutablearray,Iphone,Nsmutablearray,我有一个对象定义如下: 分数。h: @interface Scores : NSObject { NSString *sentenceKey; NSMutableArray *scorrectAnswers; } @property (nonatomic, copy) NSString *sentenceKey; @property (nonatomic, copy) NSMutableArray *scorrectAnswers; + (id)addScore:(NSString *)
@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;
分数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];}
我正在尝试使用以下方法删除可变数组上的AllObject:
- (void)removeArrayObjects;{
[scorrectAnswers removeAllObjects];}
…我从另一个程序调用它,如下所示:
for (Scores *sScore in scores)
{
[sScore removeArrayObjects];
}
。。。当我运行它时,会出现以下错误:
-[\uu NSArrayI removeAllObjects]:发送到实例0x53412d0的无法识别的选择器
有人能告诉我我做错了什么吗?谢谢。它看起来不像是由
scorrectAnswers
指向的内存实际上指向了一个NSMutableArray
。在何处以及如何初始化该变量?如果直接使用自动释放对象设置ivar,如:
scorrectAnswers = [NSMutableArray arrayWithCapacity:10];
然后,自动释放的数组将被销毁,因为您没有保留(或复制它)。如果该内存被重新分配到指向另一个对象,您将看到一个错误,就像您正在得到的一样,具有意外的类型。如果未重新分配内存,则会出现EXC\u BAD\u访问错误。您没有处理
NSMutableArray
,因为错误表明您有一个不可变的NSArray
这个问题可能就是你的答案
基本上,定义@属性时使用的副本
将导致使用
scorrectAnswers = [newMutableArray copy];
它返回一个不可变的NSArray
您可以重新实现此方法并更改前一行:
scorrectAnswers = [newMutableArray mutableCopy];
或者使用retain
而不是copy
从plist
如果您正在使用plist
它将返回NSArray
,即使您保存了NSMutableArray
它也将被强制转换。因此,在检索时,您需要执行以下操作:
scorrectAnswers = [[NSMutableArray alloc] initWithArray:[userDefault objectForKey:@"my_array_key"]]
与上面提到的类似,我有一个NSMutableArray,它在我的代码中被重新分配为NSArray。一旦我将其修改为正确的NSMutableArray,它就解决了我的问题
我建议进行快速搜索,以确保您没有在项目中的某个位置重新分配数组并进行相应修改。我不确定这是否是一个自动释放问题,但我确实考虑过这一问题,因为没有使用getter/setter。感谢您非常有用的回答。我没有使用plist。这就是我创建数组的方式:[sentenceScore setScorrectAnswers:correctAnswers];因此,如果在我的@属性语句中使用保留而不是复制,您认为这会解决我的问题吗?应该这样做,但是如果您打算使用<代码>复制< /代码>,那么您应该考虑将其保留为<代码>复制< /代码>,但使用<代码> MutabelCopy实现SETTER。谢谢