我正在使用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:
中添加方法的类。