Ошибка проверки границы - PullRequest
1 голос
/ 05 марта 2012

Недавно я внес некоторые изменения в приложение для iOS.Ничего особенного, но это было приложение, изначально написанное для iOS 2.x, и теперь мне пришлось пройти через Xcode 4.x и iOS 5.Я выжил.По крайней мере, так я и думал.

В результате всей операции мое приложение теперь работает на ЛЮБОМ устройстве iOS, КРОМЕ iPod touch второго поколения с iOS 4.2.1.(оригинальная версия работала нормально на любом устройстве).

Загадочная (по крайней мере для меня) часть заключается в следующем:

  • Приложение отлично работает в отладчике.Также после выхода из приложения я могу просто запустить его, и оно будет нормально работать
  • Если я, однако, сделаю (ad hoc) архив приложения, сохраню его как .ipa и отправлю на iPodчерез синхронизацию iTunes приложение запускается, но через некоторое время вылетает.Приложение, загруженное из AppStore, ведет себя точно так же.

Я ЛЮБЛЮ, чтобы выяснить, что здесь не так, но проблема не возникает во время отладки.

Я удалилустаревший Entitlements.plist, но также играл вокруг Entitlements.plist вокруг.Это не имело значения.(Как вы можете читать между строк, я чувствую себя немного неуверенно в этой части, потому что я действительно не понимаю Entitlements.plist и никогда не понимал его.)

Кроме того, я убедился,что и на уровне проекта, и на уровне цели, для цели развертывания iOS установлено значение 3.2, что значительно ниже версии ОС iPod.Базовый SDK установлен на «Последняя версия iOS».

Наконец, я трижды проверил, что Xcode обновлен.

Более 300 000 человек скачали мое приложение.Согласно Flurry, 6,6% имеют эту роковую комбинацию аппаратного и программного обеспечения.В последней информации о версии в AppStore я выпустил предупреждение об этой проблеме, но я бы скорее решил ее.Это первый приоритет.Понимание проблемы будет вторым.

Пожалуйста, помогите!

Вот журнал сбоев устройства (я не слишком знаком с этим, поэтому я могу опубликовать слишком много):

Incident Identifier: 12DED19E-8BF2-4BE0-A578-4778498D6BE7
CrashReporter Key:   2040f536aa51a5eb273f2d57dd42f748032a4419
Hardware Model:      iPod2,1
Process:         MyApp [1858]
Path:            /var/mobile/Applications/C240F91A-3440-418A-8C6E-C7E6BD75761B/MyApp.app/MyApp
Identifier:      MyApp
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2012-03-04 22:53:37.585 +0100
OS Version:      iPhone OS 4.2.1 (8C148)
Report Version:  104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Thread 0 Crashed:
0   libSystem.B.dylib               0x32d25ad0 __kill + 8
1   libSystem.B.dylib               0x32d25abe kill + 4
2   libSystem.B.dylib               0x32d25ab2 raise + 10
3   libSystem.B.dylib               0x32d3cd5e abort + 54
4   libstdc++.6.dylib               0x3582fa00 __gnu_cxx::__verbose_terminate_handler() + 588
5   libobjc.A.dylib                 0x301888d8 _objc_terminate + 160
6   libstdc++.6.dylib               0x3582d100 __cxxabiv1::__terminate(void (*)()) + 76
7   libstdc++.6.dylib               0x3582d178 std::terminate() + 16
8   libstdc++.6.dylib               0x3582d2a0 __cxa_throw + 100
9   libobjc.A.dylib                 0x30186f28 objc_exception_throw + 104
10  CoreFoundation                  0x35e9670e -[__NSArrayI objectAtIndex:] + 150
11  MyApp                           0x00004932 -[RootViewController setInfo] (RootViewController.m:195)
12  MyApp                           0x0000437c -[RootViewController toggleView] (RootViewController.m:90)
13  CoreFoundation                  0x35eada3c -[NSObject(NSObject) performSelector:withObject:withObject:] + 20
14  UIKit                           0x3384af18 -[UIApplication sendAction:to:from:forEvent:] + 128
15  UIKit                           0x3384ae80 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32
16  UIKit                           0x3384ae48 -[UIControl sendAction:to:forEvent:] + 44
17  UIKit                           0x3384aa98 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 528
18  UIKit                           0x3384b5c4 -[UIControl touchesEnded:withEvent:] + 452
19  UIKit                           0x3383cea8 -[UIWindow _sendTouchesForEvent:] + 580
20  UIKit                           0x3383c4dc -[UIWindow sendEvent:] + 388
21  UIKit                           0x3381fc94 -[UIApplication sendEvent:] + 444
22  UIKit                           0x3381f3ac _UIApplicationHandleEvent + 6816
23  GraphicsServices                0x35262c80 PurpleEventCallback + 1040
24  CoreFoundation                  0x35e9a5c4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 22
25  CoreFoundation                  0x35e9a582 __CFRunLoopDoSource1 + 158
26  CoreFoundation                  0x35e8c82e __CFRunLoopRun + 574
27  CoreFoundation                  0x35e8c504 CFRunLoopRunSpecific + 220
28  CoreFoundation                  0x35e8c412 CFRunLoopRunInMode + 54
29  GraphicsServices                0x35261d1c GSEventRunModal + 188
30  UIKit                           0x33865574 -[UIApplication _run] + 580
31  UIKit                           0x33862550 UIApplicationMain + 964
32  MyApp                           0x00002ba2 main (main.m:13)
33  MyApp                           0x00002b6c 0x1000 + 7020

А вот SetInfo:

- (void) setInfo {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSInteger  theFrame = [defaults integerForKey:@"currentFrame"]; 
    MyAppAppDelegate * myDelegate = (MyAppAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSMutableArray * currentCartoons = [myDelegate invert:[myDelegate readPreferences]];
    MyAppcartoon * thisCartoon = [currentCartoons objectAtIndex:theFrame];

    //format publication & date
    NSArray * titlePreSeparator = [thisCartoon.title componentsSeparatedByString:@"("];
    if ([titlePreSeparator count]>1) {
        NSString * titleSuffix = [titlePreSeparator objectAtIndex:1];
        NSArray * titleSeparator = [titleSuffix componentsSeparatedByString:@", "];
        NSString * pub = [titleSeparator objectAtIndex:0];
        flipsideViewController.Publication.text = pub;




    } else {// in case the publication metadata is missing from the rss
        flipsideViewController.Publication.text = @"";
    }

    //format title
    NSString * titlePrefix = [titlePreSeparator objectAtIndex:0];
    NSArray * titleFixer = [titlePrefix componentsSeparatedByString:@"F&S "];
    flipsideViewController.Title.text = [titleFixer objectAtIndex:1];

    //format date
    flipsideViewController.Date.text = [self formatDatefromrss:thisCartoon.publicationDate];

}

Ответы [ 2 ]

0 голосов
/ 05 марта 2012

Хорошо, поэтому журнал сбоев определенно показывает, что ваше приложение дает сбой в методе setInfo вашего класса RootViewController (вы можете видеть, что в трассировке стека [__NSArrayI objectAtIndex:] вызывается из метода setInfo).Ваш setInfo метод имеет доступ к двум массивам, который не защищен.[titleFixer objectAtIndex:1]; и [titlePreSeparator objectAtIndex:0], в значительной степени в нижней части метода.

0 голосов
/ 05 марта 2012

Я не удивлен, что у этого кода были проблемы.Там очень мало границ, проверяющих это вообще.Несмотря на то, что objectAtIndex: выделяется для меня:

flipsideViewController.Title.text = [titleFixer objectAtIndex:1];

Меня не удивит, если бы это была строка 195 в вашем исходном коде.

...