昨天想着给已有项目配置修复一下国际化问题,刚开始还能运行后续运行报错如图所示,各种方法都没有找到原因。代码基本没有任何改动,后续发现已上线的版本也无法运行。xcode定位应该是在入口的@main
开始发生问题,也怀疑是 Localizable.strings 的问题,但实际上没有任何修改记录。
报错
- 日志
2023-07-16 04:13:48.942021+0800 PDFPhoto Protector[9808:134268] -[NSTaggedPointerString count]: unrecognized selector sent to instance 0xb4fad2e3e13e9cba
2023-07-16 04:13:48.942928+0800 PDFPhoto Protector[9808:134268] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString count]: unrecognized selector sent to instance 0xb4fad2e3e13e9cba'
*** First throw call stack:
(
0 CoreFoundation 0x00000001a319b154 __exceptionPreprocess + 176
1 libobjc.A.dylib 0x00000001a2cba4d4 objc_exception_throw + 60
2 CoreFoundation 0x00000001a3242110 -[NSObject(NSObject) __retain_OA] + 0
3 CoreFoundation 0x00000001a31030a0 ___forwarding___ + 1600
4 CoreFoundation 0x00000001a31029a0 _CF_forwarding_prep_0 + 96
5 CoreFoundation 0x00000001a31df09c _CFLocaleCreateLocaleIdentifierForAvailableLocalizations + 76
6 CoreFoundation 0x00000001a30df058 _CFLocaleCopyCurrentGuts + 816
7 CoreFoundation 0x00000001a30decfc +[NSLocale currentLocale] + 16
8 Foundation 0x00000001a4044dcc -[NSUserDefaults(NSUserDefaults) init] + 1136
9 Foundation 0x00000001a4044910 +[NSUserDefaults(NSUserDefaults) standardUserDefaults] + 64
10 AppKit 0x00000001a630c804 +[NSApplication initialize] + 88
11 libobjc.A.dylib 0x00000001a2caaff0 CALLING_SOME_+initialize_METHOD + 24
12 libobjc.A.dylib 0x00000001a2caac9c initializeNonMetaClass + 904
13 libobjc.A.dylib 0x00000001a2cc50e8 _ZL24initializeAndMaybeRelockP10objc_classP11objc_objectR12locker_mixinIN9lockdebug10lock_mixinI16objc_lock_base_tEEEb + 156
14 libobjc.A.dylib 0x00000001a2caa5c4 lookUpImpOrForward + 884
15 libobjc.A.dylib 0x00000001a2ca9f64 _objc_msgSend_uncached + 68
16 AppKit 0x00000001a630c59c NSApplicationMain + 376
17 PDFPhoto Protector 0x0000000100bd7618 $sSo21NSApplicationDelegateP6AppKitE4mainyyFZ + 40
18 PDFPhoto Protector 0x0000000100bd75e0 $s18PDFPhoto_Protector11AppDelegateC5$mainyyFZ + 44
19 PDFPhoto Protector 0x0000000100bd76b0 main + 28
20 dyld 0x00000001a2cebf28 start + 2236
)
libc++abi: terminating due to uncaught exception of type NSException
(lldb)
- 标红的地方,@main
import Cocoa
@main
class AppDelegate: NSObject, NSApplicationDelegate {
解决
- 首先肯定是查找代码中是否有NSUserDefaults或者count相关用法,全局搜索没有。
- 打过断点调试、配置全局异常抓取、程序添加过抓取异常以及动态instruments等等分析都没有得到任何有效作用,还是相同的报错。
- 也重装过发行版本能够使用的程序,通用的问题,差点怀疑有可能是mac升级的问题了。
- 有一次定位到了Foundation的问题,这个怎么说呢,官方的库咋也没招。
- 尝试过删除国际等等配置文件来最小化范围定位,也没有找到具体的问题。
- 从删除软件到删除可能的缓存等等都还是相同的错误差不多快放弃了,后来发现有命令行可以删除就试了一下,然后就成功了。只能说运气好,平常开发这种配置项都不是项目中的东西,没碰到感觉真的很难定位到具体的问题,特别这种一定程度上算是系统配置了。
defaults delete <bundle_id>
吐槽
- xcode开发真难受,报错和异常信息每次感觉都是大海捞针。运气好一点可以一个一个的文件找出报错的红色标记,找出来也不一定能用,运气不好就只有一个大概的日志描述,打断点也不清楚有啥作用,也不清楚该从何入手,还会展示一堆毫无意义的汇编代码,就软件开发而言给这东西有啥用?屎一样的开发体验。
- 就目前体验而言,感觉Mac用久了之后会有一堆垃圾配置等等,删除软件都不能彻底删除所有配置等等感觉也是一个奇葩逻辑。