2010-10-01 3 views
-1

Я пытаюсь вернуть NSMutableArray, но я получил эту ошибку в консоли:Возврат ошибки в 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. Любые идеи?

+1

Вам явно нужно купить книгу о какао, чтобы сойти с земли. Если «контакты [действительно] - уже инициализированный объект NSMutableArray», вы только что получили утечку памяти или большое недоразумение Objective-C. –

ответ

3

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

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

// Best guess code sample. 
LinkedList *myLinkedList = [[LinkedList alloc] init]; 
contacts = [myLinkedList getListArray]; 
[myLinkedList release]; 
+0

Прошу прощения, я не вставлял код, где создается экземпляр класса. В моем коде я создал экземпляр так же, как вы. У меня уже есть методы работы в этом классе. = S wierd. –

+0

@ Leonardo Suzan: Не имеет значения, создан ли экземпляр - вы по-прежнему отправляете 'getListArray' самому классу. Это правильно в вашем вопросе: '[LinkedList getListArray]' - это сообщение для класса, а не какой-либо конкретный экземпляр. – Chuck

+0

Можете ли вы опубликовать код, в котором вы создаете экземпляр объекта LinkedList? Я думаю, это очень помогло бы. –

0
contacts = [LinkedList getListArray]; 

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

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

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

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

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

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

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

Когда люди делают ошибку с избыточным созданием объекта, они часто также просачивают избыточный объект (one example); вы не показали создание предыдущего массива, поэтому я не могу понять, выполнили ли вы это, поэтому на всякий случай, я также предлагаю вам прочитать или перечитать the Memory Management Programming Guide for Cocoa.

Смежные вопросы