我的产品在从xcode到模拟器和设备的调试中运行良好,但在归档和提交时没有运行。我将我的计划改为以释放方式运行,果然,它崩溃了。
以下部分代码在var homeNav
行生成EXC_BAD_ACCESS错误。此方法位于自定义TabBar控制器中。我还在下面包含了app委托调用,因为这是创建和显示tabcontroller的地方。
选项卡控制器调用:
//Sets up view on load
override func viewDidLoad() {
super.viewDidLoad()
//Setup and add home view
var homeNav = CMSSNavigationController(navigationBarClass:CMSSNavigationBar.self, toolbarClass:nil)
homeNav.viewControllers.append(CMSSHomeController(nibName:XIBS.VIEW_HOME, bundle:nil))
homeNav.tabBarItem.image = UIImage(named:Images.TAB_HOME)
homeNav.edgesForExtendedLayout = UIRectEdge.None
//Setup and add profile view
var profileNav = CMSSNavigationController(navigationBarClass:CMSSNavigationBar.self, toolbarClass:nil)
profileNav.viewControllers.append(CMSSProfileController(nibName:XIBS.VIEW_PROFILE, bundle:nil))
profileNav.tabBarItem.image = UIImage(named:Images.TAB_PROFILE)
profileNav.edgesForExtendedLayout = UIRectEdge.None
//Set tabs
self.viewControllers = NSArray(objects: homeNav, profileNav)
}
App Delegate call:
//Handles events after launch
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//Setup Google Analytics
GAI.sharedInstance().trackUncaughtExceptions = true
GAI.sharedInstance().dispatchInterval = 20
//TODO: Set logging level for analytics
GAI.sharedInstance().trackerWithTrackingId(GoogleAnalytics.TRACKING_ID)
//Set Window
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
//Create root tab controller
var rootControl = CMSSTabBarController()
self.window?.rootViewController = rootControl
self.window?.makeKeyAndVisible();
return true
}
如果所有UINavigationControllers都声明为CMSSNavigationController()
而没有提供CMSSNavigationBar,则代码在发行版中运行良好。
为什么会在发布时出现这种情况,但不会调试?我看不到任何地方表明这里没有正确分配对象或引用。
答案 0 :(得分:5)
问题是UINavigationController的构造函数中的工具栏类不能为nil。但是,编译器不会抱怨这一点。而且,虽然我不能说为什么,但是调试会允许它并且运行正常,但是发布不会。
使用
行var homeNav = CMSSNavigationController(navigationBarClass:CMSSNavigationBar.self, toolbarClass:UIToolbar.self)
完全解决了这个问题。