[UIWindow setRootViewController:]需要4.0以上支持

问题描述:今天Touch Team出Stupid测试版,安装20多台iPhone、iTouch、iPad,都可以安装。但是有一台iPhone(3.1.2)报错,不能安装。注:其他设备基本都在4.0以上。

问题分析:因为是调试安装,所以能看到报错信息,如下:

GNU gdb 6.3.50-20050815 (Apple version gdb-1518) (Sat Feb 12 02:56:02 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin --target=arm-apple-darwin".tty /dev/ttys000
target remote-mobile /tmp/.XcodeGDBRemote-16799-38
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
[Switching to process 11779 thread 0x0]
[Switching to process 11779 thread 0x0]
sharedlibrary apply-load-rules all
warning: Unable to read symbols for /Library/MobileSubstrate/MobileSubstrate.dylib (file not found).
warning: Unable to read symbols for /Library/Frameworks/CydiaSubstrate.framework/Libraries/SubstrateLoader.dylib (file not found).
2011-09-27 17:40:14.990 FSStupid[2874:207] MS:Notice: Installing: com.flipscript.stupid [FSStupid] (478.52)
2011-09-27 17:40:15.368 FSStupid[2874:207] MS:Notice: Loading: /Library/MobileSubstrate/DynamicLibraries/Backgrounder.dylib
warning: Unable to read symbols for /Library/MobileSubstrate/DynamicLibraries/Backgrounder.dylib (file not found).
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.1.3/Symbols/usr/lib/libsubstrate.dylib (file not found).
2011-09-27 17:40:17.131 FSStupid[2874:207] MS:Notice: Loading: /Library/MobileSubstrate/DynamicLibraries/Multitasking.dylib
warning: Unable to read symbols for /Library/MobileSubstrate/DynamicLibraries/Multitasking.dylib (file not found).
2011-09-27 17:40:18.007 FSStupid[2874:207] *** -[UIWindow setRootViewController:]: unrecognized selector sent to instance 0x23fe20
2011-09-27 17:40:18.016 FSStupid[2874:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIWindow setRootViewController:]: unrecognized selector sent to instance 0x23fe20'
2011-09-27 17:40:18.034 FSStupid[2874:207] Stack: (
843263261,
825818644,
843267069,
842763033,
842725440,
11685,
843742792,
843741800,
844074496,
844072508,
844071060,
860907492,
843011371,
843009055,
843738120,
843731504,
11481,
11404
)
terminate called after throwing an instance of 'NSException'
(gdb)

 

报错的语句是:

self.window.rootViewController = startViewController;

仔细查看报错信息,发现这句报错:-[UIWindow setRootViewController:]: unrecognized selector sent to instance。查看setRootViewController方法,发现需要4.0以上支持。

解决方案:把出错代码:

self.window.rootViewController = startViewController;

替换为:

if( [[[UIDevice currentDevice] systemVersion] compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending )
[self.window addSubview:self.mainViewController.view];
else self.window.rootViewController = self.mainViewController;

一切ok了。