使用@dynamic @properties的超类子类

时间:2015-02-26 22:12:34

标签: ios objective-c inheritance dynamic

我使用PAPreferences来管理应用特定的偏好/默认值。它基本上是NSUserDefaults之上的一个层,它允许我向NSUserDefaults读/写数据,就好像我只是使用普通类一样。

基本设置是子类化PAPreferences,在子类中添加@properties' .h文件,并在.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的超类编写子类?

1 个答案:

答案 0 :(得分:1)

对于动态实现属性的超类,问题并不常见。它是PAPreferences

实施的具体内容

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

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