Как устранить ошибку, когда я вызываю метод [self somemethod] - PullRequest
1 голос
/ 11 февраля 2012

У меня есть этот код:

// .m
- (void)viewDidLoad {
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [self addToArray];
}

- (void)addToArray {
    NSString *stringA;
    [stringA isEqualToString:@"door"];
    NSString *stringB;
    [stringB isEqualToString:textField.text];
    [array addObject:stringA];
    if ([stringA isEqual:stringB]) {
        [stringA isEqual:nil];
        [tableView reloadData];
    } else {
        [array addObject:stringB];
        [tableView reloadData];
    }
}

Когда я вызываю метод addToArray, он постоянно возвращает мне ошибку с именем Thread 1: Program recived signal "EXC_BAD_ACCESS", и вывод отладчика говорит: Single stepping until exit from function objc_msgSend, which has no line number information. в строке [self addToArray].Есть идеи, как это решить?Я потратил много времени на это, пожалуйста, помогите мне!

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

Как говорили другие, array должна быть переменной экземпляра или свойством класса, объявленным в файле .h:

@property (strong) NSMutableArray *array;

Или без ARC:

@property (retain) NSMutableArray *array;

Теперь вы @synthesize array; в своем файле реализации и можете получить к нему доступ из любого места.Тогда вы можете сделать:

- (void) viewDidLoad 
{
    self.array = [[NSMutableArray alloc] init];
    [self addToArray];
}

Кажется, вы предполагаете, что isEqualToString выполняет задание.Это не так, он проверяет строки на (текстовое) равенство.Попробуйте это:

- (void) addToArray
{
    NSString *stringA = @"door";
    NSString *stringB = textField.text;
    [array addObject: stringA];
    if (![stringA isEqualToString: stringB])
        [array addObject: stringB];
    [tableView reloadData];
}
1 голос
/ 11 февраля 2012

В вашем коде я могу заметить две вещи:

1) Сделайте array переменной класса, чтобы вы могли получить к ней доступ из вашего метода -[addToArray].Лучше сделайте это в вашем .h файле, например:

@interface MyViewController : UIViewController {
@private
// ...skipped...
   NSMutableArray * array;
// ...rest of class skipped...
}
@end

Тогда в вашем .m файле метод должен выглядеть следующим образом:

// .m
- (void)viewDidLoad {
    array = [[NSMutableArray alloc] init];
    [self addToArray];
}

И не забудьтеосвободить массив:

- (void)dealloc {
    [array release];
    [super dealloc];
}

2) Не путайте метод -[NSString isEqualToString:] с простым присвоением переменной.Так, в вашем -[addToArray] методе, например, замените это:

NSString *stringA;
[stringA isEqualToString:@"door"];

на это:

NSString *stringA = @"door";

И это:

NSString *stringB;    
[stringB isEqualToString:textField.text];

на это:

NSString *stringB = textField.text;

3) Проверьте логику метода -[addToArray] - не очень понятно, чего вы собираетесь достичь.

1 голос
/ 11 февраля 2012

Эти две переменные неинициализированы и вызовут у вас большие проблемы:

NSString *stringA;
[stringA isEqualToString:@"door"];
NSString *stringB;
[stringB isEqualToString:textField.text];

Вы ничего не присвоили ни строке A, ни строке B. Кроме того, результат вашего вызова isEqualToString никогда не используется.

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