Как получить строку из NSMutableArray в Objective C - PullRequest
0 голосов
/ 13 сентября 2011

Так что я застрял на этом пару часов, и я не могу понять, почему я не могу это исправить. Я просто пытаюсь получить строковое значение из NSMutableArray, но он возвращается с ошибкой "программа получила сигнал:" EXC_BAD_ACCESS ". Что меня действительно расстраивает, так это то, что я могу успешно вывести объект сразу после добавления объекта в однако массив, когда я позже пытаюсь вызвать его в моем методе buttonClicked, выдает ошибку. Кто-нибудь может увидеть, что я делаю неправильно? Я получаю сообщение об ошибке при первой попытке вывести что-то из массива, где говорит "NSMutableString * tempID = [buttonIDArray objectAtIndex: tempButtonTag];"

- buttonClicked:(id)sender
{

UIButton *selectedButton = (UIButton *)sender;
int tempButtonTag = selectedButton.tag;
NSLog(@"TempbuttonTag is %d", tempButtonTag);
Map *map =[[Map alloc] initWithNibName:nil bundle:nil];
NSMutableString *tempID = [buttonIDArray objectAtIndex:tempButtonTag];
NSMutableString *tempType = [buttonTypeArray objectAtIndex:tempButtonTag];

[map setXmlID:tempID];
[map setXmlType:tempType];
buttonIDArray = nil;
buttonTypeArray = nil;

[self presentModalViewController:map animated:YES];

}

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

if ( [elementName isEqualToString:@"Button"] ) {

    buttonViewXvalue = [tempXCorrVariable floatValue];
    buttonViewYvalue = [tempYCorrVariable floatValue];
    buttonViewWidth = [tempWidthCorrVariable floatValue];
    buttonViewLength = [tempLengthCorrVariable floatValue]; 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [button setTag:buttonTag];        
    button.frame = CGRectMake(buttonViewXvalue, buttonViewYvalue, buttonViewLength, buttonViewWidth);
    NSLog(@"xmlID is %@", xmlID);
    NSLog(@"xmlType is %@", xmlType);
    [buttonIDArray addObject:xmlID];
    [buttonTypeArray addObject:xmlType];
    NSMutableString *test = [buttonIDArray objectAtIndex:buttonTag];
    NSLog(@"Test is %@", test);

    buttonTag++;


    [self.view addSubview:button];

    button = nil;
    currentStringValue = nil;

    return;

}

Ответы [ 4 ]

3 голосов
/ 13 сентября 2011

Не забудьте сохранить массивы buttonIDArray, buttonTypeArray.Я думаю, что происходит то, что вы конструируете их правильно, но не сохраняете их, поэтому они освобождаются до того, как вы нажмете кнопку.

Редактировать: и, вероятно, возникает утечка памяти, когда вы выполняете buttonIDArray = nil вобработчик события.Если вы не сохраните ссылку на buttonIDArray где-либо еще, массив не будет освобожден и утечку (и то же самое для buttonTypeArray).Либо освободите их перед назначением nil, либо создайте сохраняющие свойства для обоих массивов и выполните self .buttonIDArray = nil, чтобы освободить массив и назначить ivar для nil.И, конечно, не забудьте освободить массивы в методе dealloc.

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

Возможно, вы используете экземпляр автоматического выпуска массива NSMutable.Который был перераспределен при попытке доступа к нему.

Решение:

Вы можете попробовать сделать buttonIDArray в качестве переменной экземпляра и создать свойство сохранения, например:

@interface ClassName
{
    NSMutableArray *buttonIDArray;
   .........
}
@property (nonatomic, retain) NSMutableArray *buttonIDArray;
@end;

и получите доступ к переменной следующим образом.

NSMutableArray *array =  [NSMutableArray alloc] init]; //chnage it to whatever way you want to init
self.buttonIDArray = array;
[array release];

Не забудьте сделать

self.buttonIDArray = nil;

в dealloc

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

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; возвращает автоматически освобожденный объект. В этом случае button = nil; не требуется.

На самом деле в вашем коде есть несколько проблем с памятью. Внимательно прочитайте Руководство по программированию управления памятью .

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

Скорее всего, это связано с освобождением xmlID и xmlType, когда вы возвращаетесь из той функции, в которую вы их добавили.Попробуйте это:

[buttonIDArray addObject:[xmlID retain]];
[buttonTypeArray addObject:[xmlType retain]];

Не забудьте выпустить их, хотя

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