iOS: иногда приложение закрывается - PullRequest
0 голосов
/ 20 декабря 2011

Мое разрабатываемое приложение для iOS иногда завершается после вызова метода addSubview: в делегате приложения (но я не уверен, что removeFromSuperview: также задействован):

[self.tabBarController.view removeFromSuperview];    
[self.window addSubview:navigationController.view];

То, что было показано в журнале:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x019b75a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x01c41313 objc_exception_throw + 44
    2   CoreFoundation                      0x019ad0a5 -[__NSArrayM objectAtIndex:] + 261
    3   <app_name>                          0x000186dd -[TableViewController tableView:numberOfRowsInSection:] + 205
    4   UIKit                               0x00a742b7 -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 1834
    5   UIKit                               0x00a71eb1 -[UITableViewRowData numberOfRowsInSection:] + 110
    6   UIKit                               0x00b60807 -[UISearchDisplayController _updateNoSearchResultsMessageVisiblity] + 115
    7   Foundation                          0x01029669 _nsnote_callback + 145
    8   CoreFoundation                      0x0198f9f9 __CFXNotificationPost_old + 745
    9   CoreFoundation                      0x0190e93a _CFXNotificationPostNotification + 186
    10  Foundation                          0x0101f20e -[NSNotificationCenter postNotificationName:object:userInfo:] + 134
    11  UIKit                               0x008df649 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 4581
    12  UIKit                               0x008d9254 -[UIWindow _setRotatableViewOrientation:duration:force:] + 89
    13  UIKit                               0x008db38f -[UIWindow setAutorotates:forceUpdateInterfaceOrientation:] + 794
    14  UIKit                               0x008d9081 -[UIWindow setDelegate:] + 252
    15  UIKit                               0x00964dee -[UIViewController _tryBecomeRootViewControllerInWindow:] + 106
    16  UIKit                               0x00975340 -[UINavigationController viewDidMoveToWindow:shouldAppearOrDisappear:] + 72
    17  UIKit                               0x008f0e4b -[UIView(Internal) _didMoveFromWindow:toWindow:] + 918
    18  UIKit                               0x008efa60 -[UIView(Hierarchy) _postMovedFromSuperview:] + 166
    19  UIKit                               0x008e8750 -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1080
    20  UIKit                               0x008e6aa3 -[UIView(Hierarchy) addSubview:] + 57
    21  <app_name>                          0x00004971 -[AppDelegate requestFinished:] + 993
    22  <app_name>                          0x0003e65b -[ASIHTTPRequest reportFinished] + 171
    23  Foundation                          0x0103e94e __NSThreadPerformPerform + 251
    24  CoreFoundation                      0x019988ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    25  CoreFoundation                      0x018f688b __CFRunLoopDoSources0 + 571
    26  CoreFoundation                      0x018f5d86 __CFRunLoopRun + 470
    27  CoreFoundation                      0x018f5840 CFRunLoopRunSpecific + 208
    28  CoreFoundation                      0x018f5761 CFRunLoopRunInMode + 97
    29  GraphicsServices                    0x01db11c4 GSEventRunModal + 217
    30  GraphicsServices                    0x01db1289 GSEventRun + 115
    31  UIKit                               0x008c5c93 UIApplicationMain + 1160
    32  <app_name>                          0x00002a30 main + 192
    33  <app_name>                          0x00002255 start + 53
)
terminate called throwing an exception

Как я могу узнать причину, по которой приложение завершается этим журналом, и решить ее? Спасибо.

Примечание: Правка 1 и Правка 2 были удалены.

Редактировать 3: Этот реализованный код метода tableView:numberOfRowsInSection: работает для меня:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        if (filteredSectionListOfAddressBook && filteredSectionListOfAddressBook.count)
        {
            return [[filteredSectionListOfAddressBook objectAtIndex:section] count];
        }
        else
        {
            return 0;
        }
    }
    else if (tableView == self.tableView)
    {
        if (sectionListOfAddressBook && sectionListOfAddressBook.count)
        {
            return [[sectionListOfAddressBook objectAtIndex:section] count];
        }
        else
        {
            return 0;
        }
    }

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 20 декабря 2011

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

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array

. На данный момент вы можете убедиться в отсутствии данных, убедившись, что

tableView: numberOfRowsInSection: возвращает 0;

Реализовали ли вы методы делегата TableViews?

Прочтите об этом здесь О табличных представлениях в приложениях для iOS *

здесь Справочник по протоколу UITableViewDataSource

и здесь Справочник по протоколу UITableViewDelegate

0 голосов
/ 11 апреля 2012

Я только что столкнулся с такой проблемой в своем коде и обнаружил, что она вызвана тем, что поисковый делегат держался за панель поиска и таблицу ref.Если установить для этих свойств значение nil в searchDisplayControllerDidEndSearch, то это избавит от проблемы.Вероятно, это было вызвано круговой петлей реф.Трассировка стека выглядела так:

[__ NSArrayM _updateNoSearchResultsMessageVisiblity]: нераспознанный селектор, отправленный экземпляру 0x21c350

#0 0x3369a1c8 in objc_exception_throw ()
#1 0x338b5aca in -[NSObject doesNotRecognizeSelector:] ()
#2 0x338b4944 in __forwarding__ ()
#3 0x3380f680 in _forwarding_prep_0__ ()
#4 0x30e5aff8 in -[UISearchResultsTableView _numberOfRowsDidChange] ()
#5 0x30d6c3b2 in -[UITableView noteNumberOfRowsChanged] ()
#6 0x30d6bf4e in -[UITableView reloadData] ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...