- [__ NSArrayI isEqualToString:]: сообщение отправлено на освобожденный экземпляр - PullRequest
1 голос
/ 31 октября 2011

Я передал значение NSArray обратно в родительское представление с помощью делегата.

оно получено в родительском представлении следующим образом:

- (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath
{
    manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"];
    NSLog(@"%@",[arrayValues valueForKey:@"MANUFACTURER"]);
    manufactureResultIndexPath = myIndexPath;
    [self.tableView reloadData]; //reloads the tabels so you can see the value in the tableViewCell.
}

Если я должен был выполнить этот код ивыберите табличную ячейку дочернего вида, он, очевидно, выполняет делегат, но затем останавливается и запускает эту ошибку в журнал

2011-10-31 14:06:16.670 code[12610:207] (
    "Alfa Romeo"
)
2011-10-31 14:06:16.673 code[12610:207] *** -[__NSArrayI isEqualToString:]: message sent to deallocated instance 0x6859280

Однако, если я закомментирую следующую строку в моем методе делегата

   - (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath
    {
        //manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"];
        NSLog(@"%@",[arrayValues valueForKey:@"MANUFACTURER"]);
        manufactureResultIndexPath = myIndexPath;
        [self.tableView reloadData]; //reloads the tabels so you can see the value in the tableViewCell.
    }

это не сбой, и я получаю NSLog с правильными деталями в моем журнале, вот так.

2011-10-31 14:09:28.200 code[12737:207] (
    Sony
)

Я надеюсь, что кто-то сталкивался с такой проблемой раньше, именно так выглядит мой объект массивакак, словарь значений.

ISELECT = F;
ISALIVE = T;
MANUFACTURER = Sony;
MANUFACTURERID = 3;

Ответы [ 3 ]

1 голос
/ 31 октября 2011

valueForKey: возвращает автоматически выпущенный экземпляр.Если вы не сохраните его, вы можете ожидать, что он будет освобожден через некоторое время после возврата из текущего метода.Похоже, вы присваиваете его переменной экземпляра.Если вы сделаете это, вам нужно сохранить его.

manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"];
[manufactureSearchObjectString retain];

Но похоже, что у вас есть другая проблема.

[arrayValues valueForKey:@"MANUFACTURER"];

Это возвращает массив.

manufactureSearchObjectString = [arrayValues valueForKey:@"MANUFACTURER"];

По имени вашей переменной это выглядит так, как будто вы присваиваете ее строковой переменной.Так что, если вы исправите проблему сохранения, у вас будет другая ошибка.Вы получите нераспознанный селектор при попытке вызвать для него isEqualToString.

Вам необходимо присвоить строковое значение для factorySearchObjectString.Вам нужно выяснить, какое строковое значение вы хотите, чтобы это было.В этом случае у вас есть только одна строка в вашем массиве, поэтому я думаю, что вы хотите эту.В этом случае

manufactureSearchObjectString = [[arrayValues valueForKey:@"MANUFACTURER"] objectAtIndex:0];
[manufactureSearchObjectString retain];

Но в целом вам нужно проверить, есть ли в массиве более одного значения, и решить, какое из них вы хотите, а также проверить, нет ли значений в массиве, исделать что-то правильное, чтобы справиться с этим.

0 голосов
/ 18 июня 2013

пожалуйста, преобразуйте его в NSString.

 NSString *manufact=[NSString stringWithFormat:@"%@",[arrayValues valueForKey:@"MANUFACTURER"];

Это не приведет к сбою.

0 голосов
/ 31 октября 2011

Попробуйте изменить код на это:

- (void) setManufactureSearchFields:(NSDictionary *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath
{
    manufactureSearchObjectString = [[arrayValues valueForKey:@"MANUFACTURER"] copy];
    NSLog(@"%@",[arrayValues valueForKey:@"MANUFACTURER"]);
    manufactureResultIndexPath = myIndexPath;
    [self.tableView reloadData]; //reloads the tabels so you can see the value in the tableViewCell.
}

Обратите внимание, что я также изменил тип переменной arrayValues на NSDictionary. Дайте мне знать, если это работает для вас.

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