NSMutableArray падает при добавлении после правильной инициализации - PullRequest
3 голосов
/ 24 февраля 2011

У меня есть NSMutableArray, определенный как свойство, синтезированный, и я назначил недавно созданный экземпляр NSMutableArray.Но после этого мое приложение всегда падает, когда я пытаюсь добавить объект в NSMutableArray.

Page.h

@interface Page : NSObject  
{  
    NSString *name;  
    UIImage *image;  
    NSMutableArray *questions;  
}
@property (nonatomic, copy) NSString *name;  
@property (nonatomic, retain) UIImage *image;  
@property (nonatomic, copy) NSMutableArray *questions;  
@end

Page.m

@implementation Page  
@synthesize name, image, questions;  
@end  

Соответствующий код

Page *testPage = [[Page alloc] init];  
testPage.image = [UIImage imageNamed:@"Cooperatief  leren Veenman-11.jpg"];  
testPage.name = [NSString stringWithString:@"Cooperatief  leren Veenman-11.jpg"];  
testPage.questions = [[NSMutableArray alloc] init];  
[testPage.questions addObject:[NSNumber numberWithFloat:arc4random()]];  

Отладчик показывает, что в момент использования testPage.questions = [[NSMutableArray alloc] init]; тип testPage.questions изменяется с NSMutableArray * на __NSArrayL * (или __NSArrayI *, не уверен).Я подозреваю, что это проблема, но я нахожу это очень странным.Кто-нибудь знает, что здесь происходит?

Ответы [ 3 ]

4 голосов
/ 24 февраля 2011

Проблема в том, что вы объявили свойство как copy. Это означает, что ваш сеттер будет реализован примерно так:

- (void) setQuestions:(NSMutableArray *)array {
  if (array != questions) {
    [questions release];
    questions = [array copy];
  }
}

Кикер здесь в том, что если вы -copy массив (неизменный или изменяемый), вы всегда получите неизменный NSArray.

Чтобы исправить это, измените свойство на retain вместо copy, а также исправьте утечку памяти:

testPage.questions = [[NSMutableArray alloc] init];

Должно быть:

testPage.questions = [NSMutableArray array];
2 голосов
/ 24 февраля 2011

@ property (nonatomic, copy) Это объявление сеттера "copy", вероятно, приведено к NSArray, почему бы не сохранить или назначить?Я бы все равно сохранил

1 голос
/ 30 марта 2011

Вы также можете создать метод изменяемого копирования, например:

- (void)setQuestions:(NSMutableArray *)newArray
{
    if (questions != newArray) 
    {
        [questions release];
        questions = [newArray mutableCopy];
    }
}
...