Как мне удалитьAllObjects на моем NSMutableArray, который является частью другого объекта? - PullRequest
2 голосов
/ 24 августа 2011

У меня есть объект, определенный следующим образом: 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];}

Я пытаюсь удалить AllAbjects из моего изменяемого массива следующим способом:

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

... которую я вызываю из другой программы, подобной этой:

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

... и я получаю эту ошибку при запуске:

- [__ NSArrayI removeAllObjects]: нераспознанный селектор отправлен в экземпляр 0x53412d0

Может кто-нибудь сказать мне, что я здесь делаю не так? Спасибо.

Ответы [ 3 ]

12 голосов
/ 24 августа 2011

Вы не имеете дело с NSMutableArray, так как ошибка указывает, что у вас есть неизменный NSArray.

На этот вопрос может быть ваш ответ NSMutableArray addObject: - [__ NSArrayI addObject:]: нераспознанный селектор, отправленный на экземпляр

В основном 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 голос
/ 24 августа 2011

Не похоже, что память, на которую указывает scorrectAnswers, фактически указывает на NSMutableArray.Где и как вы инициализируете эту переменную?Если вы устанавливаете ivar напрямую с автоматически выпущенным объектом, например:

scorrectAnswers = [NSMutableArray arrayWithCapacity:10];

, то автоматически освобожденный массив будет уничтожен, поскольку вы не сохраняете его (или не копируете).Если эта память будет перераспределена, чтобы указывать на другой объект, вы увидите ошибку, подобную той, которую вы получаете, с неожиданным типом.Если память не была перераспределена, вы получите ошибку EXC_BAD_ACCESS.

0 голосов
/ 10 октября 2012

Подобно тому, что было упомянуто выше, у меня был NSMutableArray, который перераспределялся где-то в моем коде как NSArray.После того, как я изменил его, чтобы он корректно стал NSMutableArray, он решил мою проблему.

Я бы предложил выполнить быстрый поиск, чтобы убедиться, что вы не перераспределили массив где-то в вашем проекте, и измените его соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...