NSMutableArray разрушает мою жизнь! - PullRequest
0 голосов
/ 24 марта 2010

ЕЩЕ ДРУГОЙ РЕДАКТИРОВАТЬ (чтобы увеличить странность) РЕДАКТИРОВАТЬ, чтобы показать соответствующую часть кода

Привет. Есть странная проблема с 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 ??? И почему это значит для меня ???

Ответы [ 4 ]

3 голосов
/ 24 марта 2010

Примечание для всех (и особенно для себя) ...

Я тупой, тупой мальчик.

Я выпускал элемент, который вставил в массив.

Извините за вопросы, спасибо за ответы ...

1 голос
/ 24 марта 2010

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

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

Помните, что NSMutableArray может быть инициализирован до определенной емкости, но до тех пор, пока элементы не вставлены, он фактически не содержит никаких объектов. Метод -initWithCapacity: выделяет только определенный объем памяти, но для индексов от 1 до n нет заполнителей или записей nil.

0 голосов
/ 24 марта 2010

Я подозреваю, что делегат вашего TableView не подключен правильно или подключен к недопустимому объекту. Работают ли другие ваши методы делегата? Попробуйте разместить их в верхней части didSelectRowAtIndexPath, чтобы проверить значения указателя:

NSLog(@"self=%x", self);
NSLog(@"self=%@", self);
NSLog(@"realSectionNames=%x", realSectionNames);
0 голосов
/ 24 марта 2010

1) Можем ли мы знать сообщение об ошибке? а соответствующая часть кода?

2) Вот правильный способ объявить ваш массив:

self.realSectionNames = [[NSMutableArray arrayWithCapacity:29];
...