Ошибка EXC_BAD_ACESS - PullRequest
       3

Ошибка EXC_BAD_ACESS

0 голосов
/ 27 сентября 2011

Я получаю эту ошибку EXC_BAD_ACESS в следующей строке:

NSString *titleVarName = [[NSString alloc] initWithFormat:@"%@%@",@"occasionTitle",i];

Вот цикл for, в котором находится приведенная выше строка кода:

for (i=0; i < count; ++i) 
{

    //Save the occasionS details to NSUserDefaults

    NSString *titleVarName = [[NSString alloc] initWithFormat:@"%@%@",@"occasionTitle",i];

    NSString *dateVarName = [[NSString alloc] initWithFormat:@"%@%@",@"occasionDate",i];

    NSString *imageVarName = [[NSString alloc] initWithFormat:@"%@%@",@"occasionImage",i];


    [[NSUserDefaults standardUserDefaults] setValue:[[[self displayedObjects] objectAtIndex:i]     
title] forKey:titleVarName];

    [[NSUserDefaults standardUserDefaults] setValue:[[[self displayedObjects] objectAtIndex:i]     
date] forKey:dateVarName];

    [[NSUserDefaults standardUserDefaults] setValue:[[[self displayedObjects] objectAtIndex:i] 
imagePath] forKey:imageVarName]; 

    //release

    [titleVarName release];
    [dateVarName release];
    [imageVarName release];


    [self dismissModalViewControllerAnimated:YES];
}

Разве нельзя распределять объекты и освобождать их внутри цикла for?

Ответы [ 3 ]

2 голосов
/ 27 сентября 2011

Вам нужно использовать спецификатор %d или %i вместо %@ для указания целого числа.Если с int используется %@, то он попытается получить доступ к объекту по адресу, указанному в int.Например, если значение i равно единице, оно пытается получить доступ к объекту по адресу один, что приведет к неправильному доступу.

NSString *titleVarName = [[NSString alloc] initWithFormat:@"%@%d",@"occasionTitle",i];

А также вам здесь не нужны alloc и release, хотя это не является причиной плохого доступа.Вы можете использовать вспомогательный конструктор.

NSString *titleVarName = [NSString stringWithFormat:@"occasionTitle%d", i];
// release not required

Сделайте то же самое для dateVarName и imageVarName тоже.

2 голосов
/ 27 сентября 2011

Предполагая, что i является int, эта строка должна быть

NSString *titleVarName = [[NSString alloc] initWithFormat:@"%@%i",@"occasionTitle",i];

%@ используется для объектов Какао, а не примитивов типа int, float или bool;

0 голосов
/ 27 сентября 2011

Использовать спецификатор формата %@ только для NSObject объектов.

Поскольку i является целым числом в вашем коде, вы должны использовать %d или %i для целых чисел.

Более того, нет необходимости включать строку, используя %@, вы можете использовать статическую строку непосредственно в строке формата:

NSString *titleVarName = [[NSString alloc] initWithFormat:@"occasionTitle%i",i];
...