Ios 如何获取目标C中特定类的所有分配实例?

Ios 如何获取目标C中特定类的所有分配实例?,ios,objective-c,runtime,objective-c-runtime,Ios,Objective C,Runtime,Objective C Runtime,我试图实现该组件,以便在运行时将不同的外观应用于视图和控制器,而无需重新初始化这些控件。我想用这样的逻辑: 使用应用皮肤的方法声明协议 所有必要的类都实现这个协议 当用户选择皮肤时,符合协议的类的所有实例都将接收消息以应用皮肤 因此,我知道如何通过使用objc\u getClassList和class\u conformsToProtocol函数获取符合我的特定协议的所有必要类。 但如何获得这些类的所有已分配实例以向它们发送消息呢 我知道它可以通过每个类的内部逻辑来实现,方法是将所有实例存储在静

我试图实现该组件,以便在运行时将不同的外观应用于视图和控制器,而无需重新初始化这些控件。我想用这样的逻辑:

  • 使用应用皮肤的方法声明协议
  • 所有必要的类都实现这个协议
  • 当用户选择皮肤时,符合协议的类的所有实例都将接收消息以应用皮肤 因此,我知道如何通过使用
    objc\u getClassList
    class\u conformsToProtocol
    函数获取符合我的特定协议的所有必要类。
    但如何获得这些类的所有已分配实例以向它们发送消息呢


    我知道它可以通过每个类的内部逻辑来实现,方法是将所有实例存储在静态存储中并按类方法返回数组。但这不是一个优雅的解决方案。我正在寻找更通用的解决方案,在那里我可以轻松地添加新的可蒙皮控件。

    听起来很像是你在重新发明。你至少应该从那里开始。这就是它的目的。有关添加自定义属性的讨论,请参见writeup

    对于您的基本问题,没有运行时调用来枚举类的所有分配对象。这样做会增加很多开销(对象总是很快地来来去去去)。即使你能做到,你也不应该。但由于您讨论的是可见视图,因此始终可以通过在
    NSWindow
    下枚举视图层次结构来完成此操作。当前不在视图层次结构中的任何视图在下次出现在屏幕上时都应以新样式正确地重新绘制


    但是我想从

    开始,听起来你应该使用
    NSNotificationCenter
    ?@nhgrif使用
    NSNotificationCenter
    是可能的,但在这种情况下,我需要在每个类中添加
    self
    作为观察者。此外,如果我/他在实现新类(实现应用皮肤的协议)时不这样做,编译器不会为我或其他开发人员生成任何警告。在每个类中添加
    self
    作为观察者是很容易的。您应该开发一个所有其他类都从中继承的基类,并且该基类可以注册(并在dealloc中注销)对于通知,并设置其响应的方法。@NHGRI如果主要问题是继承不能在此处应用,因为可以应用皮肤的类可能是不同类的子类:UIView、UILabel、UIButton、UIViewController等。因此没有基类。首先,
    UIViewController
    不应是类之一。其次,您可以创建一些基类。
    UIView
    的子类并不多(您应该只担心这些子类)。这些基类中的每一个都只是少数代码。一行用于在init中注册通知,一行用于在dealloc中注销,以及一个响应通知的存根方法。您可以将这些基类中的每一个都放在一个
    .h/.m
    中。Rob,感谢您的想法,我认为UIWindow hierarchy+是一个很好的开始。