Сбой программы при добавлении словаря в массив? - PullRequest
1 голос
/ 15 марта 2012

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

 NSMutableDictionary *schools = [[NSMutableDictionary alloc] init];
    [schools setObject:name forKey:kFavoriteSchoolName];
    //load data is getting data from NSUserDefault which I save
    NSMutableArray *loadedArray = [self loadData];

//if loadedarray has object in there, then continue adding schools to it or make new array
if([loadedArray count] > 0)
{
    [loadedArray addObject:schools];

    > // it crashes here


    [schools release];

    return loadedArray;
} else
{ 

    //It will add the school to the array for the first time if there is nothing when it loaded.

    NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease];
    [tempArray addObject:schools];

    [schools release];

    return tempArray;
}

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

Это мой код функции loadData

- (NSMutableArray *) loadData
{
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    
    NSMutableArray *list = [userDefault objectForKey:kSchoolList];
    
    return list;
    
}

В журнале ничего не сказано, кроме этого: Поток 1: Программа получила сигнал "SGABRT"

когда я впервые запускаю программу и добавляю, все нормально, я снова добавляю школу, потом только она вылетает, вылетает в [загруженный объект-объект: школы];

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Ваш код выглядит ясно. Единственное белое пятно - способ создания массива в методе [self loadData].

Вы упомянули, что восстанавливаете его из NSUserDefaults. Возможно, вы просто вернете его на [[NSUserDefaults standardUserDefaults] objectForKey:@"schools"].

Поскольку метод objectForKey: возвращает объект типа id, вы не получите предупреждение о том, что objectForKey: возвращает NSArray, а не NSMutableArray.

Просто сделайте что-то вроде этого:

return [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"schools"]];


Надеюсь, я угадал твой код правильно;)

0 голосов
/ 28 марта 2017

Я обнаружил, что вы не инициализировали свой массив loadArray.Вы не можете добавить какое-либо значение в неинициализированный NSMutableArray.

Вам нужно начать с инициализации.

NSMutableArray *loadArray  = [[NSMutableArray alloc]init];

Затем заполнить данные в вашем массиве

[loadArray  addObjectsFromArray:[self loadData]];
0 голосов
/ 15 марта 2012

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

 NSMutableDictionary *schools = [[NSMutableDictionary alloc] init];
    [schools setObject:name forKey:kFavoriteSchoolName];
    //load data is getting data from NSUserDefault which I save
    NSMutableArray *loadedArray = [[self loadData] retain];

//if loadedarray has object in there, then continue adding schools to it or make new array
if([loadedArray count] > 0)
{
    if([loadedArray isKindOfClass:[NSMutableArray class]]) {
    [loadedArray addObject:schools];
    }
    else {NSLog(@"Not a mutable array");}

    > // it crashes here


    [schools release];

    return [loadedArray autorelease];
} else
{ 
    [loadedArray release];
    //It will add the school to the array for the first time if there is nothing when it loaded.

    NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease];
    [tempArray addObject:schools];

    [schools release];

    return tempArray;
}
...