在运行时从类外部访问Objective-C ivar

时间:2013-09-22 02:52:27

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

我知道这个想法完全打破了封装,但是说我有以下类扩展:

@interface MyClass () {
    int reallyImportantIvar;
}
// ...
@end

通常,类的行为应该在Objective-C层内部 - 发送和接收消息等。但是有一个('公共')子例程,我需要最好的性能和非常低的延迟,所以我会更喜欢使用C方法。当然,如果我这样做,我就再也无法访问 reallyImportantIvar ,这是我性能关键任务的关键。

似乎我有两个选择:

  1. 改为将实例变量设为静态变量。
  2. 通过Objective-C运行时直接访问实例变量。
  3. 我的问题是:选项2是否可能,如果可以,它的开销是多少? (例如,我还在查看O(n)算法来查找类的实例变量吗?)

3 个答案:

答案 0 :(得分:8)

实际上,如果C函数的定义在类的@implementation块内,那么它可以通过通常的object->someIvar符号访问该类的私有ivars。因此,当你可以使用运行时来访问它时,我认为你不需要。只需在相关类的@implementation块中实现该函数,您应该没问题。

答案 1 :(得分:5)

另一种方法是将ivar声明为@package@public。然后在类的实现之外的代码可以#include该类扩展可以使用ivar。

@public允许任何代码执行此操作。 @package将范围限制为与类的实现相同的二进制文件,这在编写共享库时通常是合适的。

答案 2 :(得分:1)

Objective-C运行时包含object_getInstanceVariable()函数。我相信这就是你要找的东西。我没有详细检查,但我不相信以这种方式访问​​它和正常方式之间有任何重大差异。