事情是这样的,我把项目所有的属性和方法(尽可能地)改成了 objc_direct 修饰来减少包体。然后 App 启动之后就 crash 了。
问题出在启动后原本 work 的自定义 tabbar 代码,通过 UINavigationController 获取的 tabBarItem 变成了系统类而非自定义类,导致 unrecognized selector 错误。
排查发现 -[UINavigationController tabBarItem] 会 lazy initialize 一个 UITabBarItem 对象,然后去获取其 root view controller 的 tabBarItem,如果后者的 image/selectedImage 属性,就会返回前者。这是个 undocumented 都行为额。
— Oct 13, 2021