更新到 macOS 后出现关于 "dynamic accessors failing" 的未知错误
Getting unknown error about "dynamic accessors failing" after updating to macOS
升级到 macOS Sierra (10.12) 和 Xcode 8.0 (8A218a) 后,我的 macOS/Cocoa 应用程序(用 Objective-C 编写)开始收到许多错误消息格式:
[error] warning: dynamic accessors failed to find @property implementation for 'uniqueId' for entity ABCDInfo while resolving selector 'uniqueId' on class 'ABCDInfo'. Did you remember to declare it @dynamic or @synthesized in the @implementation ?
[error] warning: dynamic accessors failed to find @property implementation for 'uniqueId' for entity ABCDContact while resolving selector 'uniqueId' on class 'ABCDContact'. Did you remember to declare it @dynamic or @synthesized in the @implementation ?
[error] warning: dynamic accessors failed to find @property implementation for 'uniqueId' for entity ABCDEmailAddress while resolving selector 'uniqueId' on class 'ABCDEmailAddress'. Did you remember to declare it @dynamic or @synthesized in the @implementation ?
[error] warning: dynamic accessors failed to find @property implementation for 'address' for entity ABCDEmailAddress while resolving selector 'address' on class 'ABCDEmailAddress'. Did you remember to declare it @dynamic or @synthesized in the @implementation ?
None 这是我的代码或来自我正在使用的第 3 方开发人员库的代码,并搜索这些变量名称(即:'uniqueId' 或 'ABCDInfo' ) 没有拉出任何东西,表明它不在我的项目中。
我看到这个问题也在 Apple 的开发者论坛上被报告了两次 (Issue 1 and Issue 2),但是这两个问题都没有得到解答
我的问题是:出现这些错误消息的原因是什么,我该如何解决?
它不会导致我的应用程序崩溃,但我宁愿找出并理解问题所在。
可能与此配置有关:
- 您正在访问 AddressBook 框架,可能是 'implicit synthesized properties' ON 构建的。
- 您的软件是在 'implicit synthesized properties' OFF
的情况下构建的
首先让我们检查一下@synthesize 和@dynamic 是什么:
- @synthesize 将为您的 属性
生成 getter 和 setter 方法
- @dynamic 告诉编译器 getter 和 setter 方法
不是由 class 本身实现的,而是由其他地方实现的(比如
superclass 或将在运行时提供)
Contacts 现在要求使用 mail/contact 框架的任何人都需要使用 uses-contacts 权利进行代码签名。
您需要通过授予 "Contacts access" 权利对您的应用进行沙箱化。警告仍将被记录,但这与 XCode 8 的另一个错误有关,该错误记录了很多无用的东西。
Apple 似乎将不再接受非沙盒应用访问通讯录(或位置或日历)。
要将您的应用沙箱化,请执行以下操作:
转到您的项目设置 > Select 您的应用程序 > 启用 App SandBox 然后 select 您正在使用的应用程序数据。
升级到 macOS Sierra (10.12) 和 Xcode 8.0 (8A218a) 后,我的 macOS/Cocoa 应用程序(用 Objective-C 编写)开始收到许多错误消息格式:
[error] warning: dynamic accessors failed to find @property implementation for 'uniqueId' for entity ABCDInfo while resolving selector 'uniqueId' on class 'ABCDInfo'. Did you remember to declare it @dynamic or @synthesized in the @implementation ?
[error] warning: dynamic accessors failed to find @property implementation for 'uniqueId' for entity ABCDContact while resolving selector 'uniqueId' on class 'ABCDContact'. Did you remember to declare it @dynamic or @synthesized in the @implementation ?
[error] warning: dynamic accessors failed to find @property implementation for 'uniqueId' for entity ABCDEmailAddress while resolving selector 'uniqueId' on class 'ABCDEmailAddress'. Did you remember to declare it @dynamic or @synthesized in the @implementation ?
[error] warning: dynamic accessors failed to find @property implementation for 'address' for entity ABCDEmailAddress while resolving selector 'address' on class 'ABCDEmailAddress'. Did you remember to declare it @dynamic or @synthesized in the @implementation ?
None 这是我的代码或来自我正在使用的第 3 方开发人员库的代码,并搜索这些变量名称(即:'uniqueId' 或 'ABCDInfo' ) 没有拉出任何东西,表明它不在我的项目中。
我看到这个问题也在 Apple 的开发者论坛上被报告了两次 (Issue 1 and Issue 2),但是这两个问题都没有得到解答
我的问题是:出现这些错误消息的原因是什么,我该如何解决? 它不会导致我的应用程序崩溃,但我宁愿找出并理解问题所在。
可能与此配置有关:
- 您正在访问 AddressBook 框架,可能是 'implicit synthesized properties' ON 构建的。
- 您的软件是在 'implicit synthesized properties' OFF 的情况下构建的
首先让我们检查一下@synthesize 和@dynamic 是什么:
- @synthesize 将为您的 属性 生成 getter 和 setter 方法
- @dynamic 告诉编译器 getter 和 setter 方法 不是由 class 本身实现的,而是由其他地方实现的(比如 superclass 或将在运行时提供)
Contacts 现在要求使用 mail/contact 框架的任何人都需要使用 uses-contacts 权利进行代码签名。
您需要通过授予 "Contacts access" 权利对您的应用进行沙箱化。警告仍将被记录,但这与 XCode 8 的另一个错误有关,该错误记录了很多无用的东西。
Apple 似乎将不再接受非沙盒应用访问通讯录(或位置或日历)。
要将您的应用沙箱化,请执行以下操作: 转到您的项目设置 > Select 您的应用程序 > 启用 App SandBox 然后 select 您正在使用的应用程序数据。