【问题标题】:How to get all allocated instances of specific class in Objective C?如何在Objective C中获取特定类的所有分配实例?
【发布时间】:2014-05-16 21:46:55
【问题描述】:

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

  1. 用应用皮肤的方法声明协议。
  2. 所有必要的类都实现了这个协议。
  3. 当用户选择皮肤时,所有符合协议的类实例都会收到消息以应用皮肤。

所以我知道如何使用objc_getClassListclass_conformsToProtocol 函数来获取符合我的特定协议的所有必要类。
但是如何获取这些类的所有分配实例以向它们发送消息?

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

【问题讨论】:

  • 听起来你应该使用NSNotificationCenter
  • @nhgrif 使用NSNotificationCenter 是可能的,但在这种情况下,我需要在每个班级中添加self 作为观察者。此外,如果我/他在实现实现应用皮肤协议的新类时不这样做,编译器也不会为我或其他开发人员生成任何警告。
  • 在每个班级中添加self 作为观察者很容易。您应该开发一个所有其他类都继承自的基类,并且该基类可以注册(并在 dealloc 中取消注册)通知并设置它响应的方法。
  • @nhgrif 这里不能应用继承的主要问题,因为可以应用皮肤的类可能是不同类的子类:UIView、UILabel、UIButton、UIViewController 等。所以没有基类.
  • 首先,UIViewController 不应该是类之一。其次,您可以创建一些基类。 UIView 的子类并不多(这应该是你唯一担心的)。这些基类中的每一个都只是一小部分代码。一行在 init 中注册通知,一行在 dealloc 中取消注册,以及一个响应通知的存根方法。您甚至可以将这些基类中的每一个都放在一个 .h/.m 中。

标签: ios objective-c runtime objective-c-runtime


【解决方案1】:

这听起来很像是你在重新发明<UIAppearance>。你至少应该从那里开始。这就是它的用途。另请参阅Peter Steinberger's writeup 以了解添加自定义属性的讨论。

对于您的基本问题,没有运行时调用来枚举类的所有已分配对象。提供它会增加很多开销(对象总是来去匆匆,而且非常快)。即使你能做到,你也不应该这样做。但既然你在谈论可见视图,那么你总是可以通过枚举NSWindow 下的视图层次结构来做到这一点。当前不在视图层次结构中的任何视图都应该在下次出现在屏幕上时正确地以新样式重绘。

但我会从<UIAppearance>开始。

【讨论】:

  • Rob,谢谢你的想法,我认为 UIWindow 层次结构 + 是很好的开始。
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2022-09-27
  • 2012-04-25
相关资源
最近更新 更多