我正在使用PAPreferences来管理应用特定的首选项/默认设置。它基本上是NSUserDefaults之上的一层,使我可以将数据读/写到NSUserDefaults,就像我只是在使用普通类一样。

基本设置是对PAPreferences进行子类化,在子类的.h文件中添加@properties,然后在.m文件中将它们声明为@dynamic

类的层次结构如下所示:

- PAPreferences
    - MyPreferences // all @properties defined here, and set in -init


我的项目建立了许多不同的目标,并且每次添加新目标时,都必须复制以前的MyPreferences文件。很多代码是重复的,并且每次我想更改应用程序的首选项时,都必须在许多不同的文件中进行更改。

我想创建一个类层次结构,如下所示:

- PAPreferences
    - MyPreferencesBase // all @properties defined here
        - MyPreferences // all @properties set in -init


在先前的类层次结构中,运行MyPreferenes#init时,我的应用程序崩溃了,我设置了第一个实例变量(无法识别的选择器发送到实例)。

如何为@properties设置为@dyanmic的超类编写子类?

最佳答案

这个问题对于动态地实现属性的超类并不普遍。它特定于PAPreferences的实现。

-[PAPreferences init]中,它使用运行时函数class_copyPropertyList()检查当前类的属性。该函数记录为仅返回在该类中声明的属性,而不返回其超类。因此,PAPreferences对超类的动态属性视而不见。

[PAPreferences init]需要走超类链,处理所有类的属性。它到达它自己时将停止。它可能还需要调整在+resolveInstanceMethod:中添加方法的类。

10-06 07:28