【问题标题】:Is it possible to create methods and variables, set them at runtime in Objective-C?是否可以创建方法和变量,在运行时在 Objective-C 中设置它们?
【发布时间】:2014-03-29 21:37:40
【问题描述】:

例如:

@implementation MyClass{
    NSNumber *something;
}

我希望能够在运行时向特定对象(仅一个实例)添加一些其他类似的对象,而不是整个类。他们已经有指向其他对象的指针,我需要 MyClass 才能使用它们。

用例是这样的。我在另一个实例中,称它为 A,我有一些变量和方法,我想将变量和方法注入 B,执行方法并将它们分离,所以对象 B 是原始的。

*在方法的情况下,我最好不要 class_addMethod 它,而是宁愿只将实现发送到对象 A 以自行执行。

【问题讨论】:

  • 那么在您“分离”它们之后发生了什么变化?该方法编辑了一些“原始”实例变量?
  • 是的。对象 A 自身的原始变量已被修改。
  • 不,你不能这样做。您需要创建一个全新的类(它可能只是 MyClass 的子类和更多的 iVar),因为一旦在运行时注册了该类,就不能向其中添加 ivars。但是,可以随时将方法添加到任何类中。
  • 也许您可以使用关联对象?它们提供了与实例变量类似的构造。
  • Objective-C 很可能有可能——有许多非常奇怪的函数可以用来在运行时修改类或对象——但是接口非常神秘和“危险”,所以最好建议你找到一种不同的技术。

标签: objective-c objective-c-blocks objective-c-runtime objective-c-category


【解决方案1】:

您可以使用关联对象(请参阅objc_setAssociatedObject() 和相关函数),但在运行时添加 ivars 是一种相当不常见的做法。你想完成什么?

【讨论】:

  • 例如,我有 10 个完全不同类别的对象。它们需要交互,一次 5 到 6 个,并且它们各自的变量会根据交互的组成而变化。我需要让每个对象在运行时都知道所有其他对象。如何使用 objc_getAssociatedObject()。我刚刚读到,如果您将 Ivars 隐藏在假的 getter 和 setter 后面,您就可以伪造 Ivars。理论上可以在每个对象中存储与所有其他对象的关联,我基本上需要存储对象本身、它在组合中的角色以及我可以在其上执行的块列表。
  • 听起来您只需要进入 KVO,这是整个 Cocoa 体验中非常有用的部分。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2012-07-15
  • 2011-03-17
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多