ЕЩЕ ДРУГОЙ РЕДАКТИРОВАТЬ (чтобы увеличить странность)
РЕДАКТИРОВАТЬ, чтобы показать соответствующую часть кода
Привет. Есть странная проблема с NSMutableArray, которую я просто не понимаю ...
Разъяснение:
У меня есть NSMutableArray, определенный как свойство (nonatomic, retain), синтезированный и инициализированный с 29 элементами.
realSectionNames = [[NSMutableArray alloc] initWithCapacity:29];
После инициализации я могу вставлять элементы по своему желанию, и все, кажется, работает нормально.
Однако, пока я запускаю приложение, если я вставлю новый элемент в массив, я могу напечатать массив в функции, в которую я вставил элемент, и все будет в порядке.
Однако, когда я выбираю строку в таблице и мне нужно прочитать этот массив, мое приложение вылетает. На самом деле, он даже не может больше печатать массив.
Есть ли какой-нибудь "магический и логический трюк", который каждый должен знать при использовании NSMutableArray, который может отсутствовать у такого новичка, как я?
Большое спасибо.
Я объявляю свой массив как
realSectionNames = [[NSMutableArray alloc] initWithCapacity:29];
Я вставляю объекты в мой массив с помощью
[realSectionNames addObject:[category categoryFirstLetter]];
хотя я знаю, что могу также вставить его с
[realSectionNames insertObject:[category categoryFirstLetter] atIndex:i];
где "i" - это первая незанятая позиция.
После вставки я перезагружаю данные моего tableView. Печать массива до или после перезагрузки данных показывает, что он имеет нужную информацию.
После этого при выборе строки в таблице происходит сбой приложения. Это realSectionNames используется в нескольких функциях UITableViewDelegate, но для случая это не имеет значения. Что действительно важно, так это то, что печать массива в начале функции didSelectRowAtIndexPath приводит к сбою всего (и, конечно, ничего не печатает). Я почти уверен, что именно в этой строке он печатает все, что он пишет перед работой (пример):
NSLog(@"Anything");
NSLog(@"%@", realSectionNames);
дает вывод:
2010-03-24 15: 16: 04.146 myApplicationExperience [3527: 207] Все, что угодно
[Сессия началась в 2010-03-24 15:16:04 +0000.]
GNU gdb 6.3.50-20050815 (версия Apple, gdb-967) (вторник, 14 июля, 02:11:58 UTC 2009)
Copyright 2004 Free Software Foundation, Inc.
GDB - это бесплатное программное обеспечение, на которое распространяется стандартная общественная лицензия GNU, и вы
добро пожаловать изменить его и / или распространять его копии при определенных условиях.
Введите «показать копирование», чтобы увидеть условия.
На GDB нет абсолютно никаких гарантий. Тип "показать гарантию" для деталей.
Эта GDB была настроена как «i386-apple-darwin» .sharedlibrary apply-load-rules all
Присоединение к процессу 3527.
Все еще не понимая, какую глупость я совершил на этот раз ... может быть, еще не слишком поздно следовать карьере хирурга мозга?
после ответа я напечатал
NSLog(@"self=%x", self);
NSLog(@"self=%@", self);
NSLog(@"realSectionNames=%x", realSectionNames);
дает одинаковые результаты в каждой функции (от делегата или нет).
NSLog(@"realSections = %@", realSectionNames);
хорошо печатается в моем viewWillAppear, в didSelectRowAtIndexPath и вылетает в viewForHeaderInSection. Кстати, без потоков ...
Итак, не зная, что делать, я пробую "вещи" ... Я изменил все ссылки на realSectionNames на self.realSectionNames
печать в viewForHeaderInSection дает следующую проблему:
2010-03-24 16:01:44.067 myApplication[4104:207] numberOfSectionsInTableView result -> 1
2010-03-24 16:01:44.068 myApplication[4104:207] viewForHeaderAtSection
2010-03-24 16:01:44.068 myApplication[4104:207] self=3d13470
2010-03-24 16:01:44.068 myApplication[4104:207] self=<RootViewController: 0x3d13470>
2010-03-24 16:01:44.069 myApplication[4104:207] self.realSectionNames=3b12830
2010-03-24 16:01:44.070 myApplication[4104:207] realSections = (
<__NSArrayReverseEnumerator: 0x3b50500>
)
2010-03-24 16:01:44.070 myApplication[4104:207] *** -[__NSArrayReverseEnumerator length]: unrecognized selector sent to instance 0x3b50500
2010-03-24 16:01:44.071 myApplication[4104:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayReverseEnumerator length]: unrecognized selector sent to instance 0x3b50500'
2010-03-24 16:01:44.072 myApplication[4104:207] Stack: (
31073371,
2572170505,
31455291,
31024758,
30877378,
276908,
26404,
3227182,
4544033,
4551926,
4550923,
3267462,
3207973,
3249408,
25927,
3222086,
3205252,
459178,
30857920,
30854216,
39163413,
39163610,
2949039
)
Что такое NSArrayReverseEnumerator ??? И почему это значит для меня ???