最近,我对iOS应用程序进行了一些更改。没什么特别的,但它是最初为iOS 2.x编写的应用程序,现在我不得不通过Xcode 4.x& iOS 5 hoopla。我活了下来。至少,这就是我的想法。
作为整个操作的结果,我的应用程序现在可以在任何iOS设备上运行,除了iOS 4.2.1的第二代iPod touch。 (原始版本在任何设备上运行正常)。
令人费解的(至少对我而言)部分如下:
我很想知道这里出了什么问题,但在调试过程中不会出现这个问题。
我已经删除了遗留的Entitlements.plist,但也围绕着Entitlements.plist。它没有任何区别。 (正如你可能在这两行之间读到的那样,我对这部分感到有点不安全,因为我并不真正了解Entitlements.plist,也没有理解它。)
另外,我确信,在Project和Target级别,iOS部署目标设置为3.2,远低于iPod的操作系统版本。 Base 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];
}
答案 0 :(得分:0)
我对此代码遇到麻烦并不感到惊讶。根本没有检查的界限。虽然对我而言突出的objectAtIndex:
是:
flipsideViewController.Title.text = [titleFixer objectAtIndex:1];
如果这是源代码中的第195行,我不会感到惊讶。
答案 1 :(得分:0)
好的,崩溃日志肯定会显示您的应用程序在RootViewController类的setInfo
方法中崩溃(您可以看到在堆栈跟踪中,[__NSArrayI objectAtIndex:]
从{{1}调用}} 方法)。您的setInfo
方法有两个不安全的阵列访问权限。 setInfo
和[titleFixer objectAtIndex:1];
,几乎就是方法的底部。