-[__NSArrayI isEqualToString:]: сообщение, отправленное освобожденному экземпляру

#iphone #ios #uitableview #delegates

#iPhone #iOS #uitableview #делегаты

Вопрос:

Я передал значение 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;
  

Комментарии:

1. Один из ваших ключей отсутствует. Он был освобожден, так как вы сделали слишком много релизов для него.

2. Возможно, проблема связана с другими частями вашего кода. Вы использовали manufactureSearchObjectString где-нибудь еще?

3. да, я думаю о том же, что и сейчас, появляется ошибка, когда я передаю значение в uilabel, например, label2.text = manufactureSearchObjectString; что, я уверен, неправильно, но не уверен, как исправить, поскольку я пытаюсь поместить массив в текстовое значение, я думаю, что янужно сделать isequaltostring или что-то в этом роде?

4. Я думаю, вам следует сначала получить доступ к объекту массива, а затем использовать метод valueForKey:, чтобы сначала получить NSDictionary с вашими значениями, а затем получить доступ к нужному объекту; что-то вроде manufactureSearchObjectString = [[arrayValues objectAtIndex:myIndexPath.row] objectForKey:@»ПРОИЗВОДИТЕЛЬ»];. Надеюсь, это поможет.

5. ISELECT = F; ISALIVE = T; ПРОИЗВОДИТЕЛЬ = Sony; MANUFACTURERID = 3; является объектом массива, поэтому мне не нужно использовать indexPath. значение indexpath, которое у меня есть, заключается в том, чтобы отказаться от дополнительной галочки в подвиде (последний выбор) на случай, если пользователь захочет ее изменить.

Ответ №1:

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

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

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

 [arrayValues valueForKey:@"MANUFACTURER"];
  

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

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

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

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

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

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

Комментарии:

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

Ответ №2:

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

 - (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 . Дайте мне знать, если это сработает для вас.

Комментарии:

1. Я передаю ему значение массива, поэтому я не смог изменить его на nsdictionary. Я попробовал скопировать версию вашего кода, и она по-прежнему выдает ту же ошибку… дело в том, что теперь он выделил другую часть моего кода с ошибкой, как указано выше. когда я настраиваю свою метку текстового поля для отображения значения производства, которое я собираюсь получить, я делаю это так .. очевидно, это неправильно. но я не знаю почему. label2.text = manufactureSearchObjectString;

2. может быть, потому, что я передаю ему значение массива в строку?

Ответ №3:

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

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

Сбой не произойдет.