Вернуть ошибку в NSMutableArray - PullRequest
0 голосов
/ 01 октября 2010

Я пытаюсь вернуть NSMutableArray, но я получил эту ошибку в консоли:

2010-10-01 14: 12: 21.348 Телефонная книга [1424: a0f] + [LinkedList getListArray]: нераспознанный селектор отправлен в класс 0x1000053e8

Код метода:

- (id)getListArray {
 ListNode *tmp = iterator;
 iterator = head;

 NSMutableArray * list = [NSMutableArray arrayWithCapacity:self.getNSIntegerNum];

 while ([iterator next] != nil) {
  [list addObject:[iterator data]];
 }

 iterator = tmp;

 return list;

}

и вызов метода:

contacts = [LinkedList getListArray];

«контакты» - это уже инициализированный объект NSMutableArray.Есть идеи?

Ответы [ 2 ]

3 голосов
/ 01 октября 2010

Похоже, вы вызываете getListArray, как если бы это был метод класса, но он определен как метод экземпляра.

Вам нужно либо определить getListArray как метод класса (с + вместо - в начале), либо создать экземпляр LinkedList и вызвать для него getListArray.

// Best guess code sample.
LinkedList *myLinkedList = [[LinkedList alloc] init];
contacts = [myLinkedList getListArray];
[myLinkedList release];
0 голосов
/ 02 октября 2010
contacts = [LinkedList getListArray];

contacts - это уже инициализированный объект NSMutableArray.

Или это было. Если сообщение прошло (то есть, если класс LinkedList ответил на это сообщение или если вы вместо этого отправили его экземпляру LinkedList), это назначение заменит массив, который вы ранее создали и сохранили в contacts, с массивом. создано и возвращено getListArray.

Помните: переменная contacts не является массивом. Это контейнер для указателя на объект (массив). Вы говорите, что ранее создали массив и сохранили его указатель в этой переменной; теперь вы пытаетесь получить другой массив и сохранить в этой переменной его указатель , который заменит любой указатель, существовавший ранее.

На самом деле единственная причина, по которой вы не заменяете массив contacts, - это причина, на которую указал робот K: вы отправляете сообщение классу LinkedList, но на него отвечают только экземпляры LinkedList.

Существует два решения как создания избыточного массива, так и исключения:

  1. Переименуйте getListArray в getListArray: и заставьте его принять NSMutableArray в качестве параметра и заполните этот массив.
  2. Прекратите заранее создавать пустой массив (вам не нужно) и отправьте сообщение getListArray в экземпляр LinkedList, а не в класс LinkedList. Последняя часть - то, что предложил Робот К.

Я рекомендую решение № 2.

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

...