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

Eph*_*era 0 c objective-c objective-c-runtime

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

@interface MyClass () {
    int reallyImportantIvar;
}
// ...
@end
Run Code Online (Sandbox Code Playgroud)

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

看来我有两个选择:

  1. 将实例变量改为静态变量.
  2. 通过Objective-C运行时直接访问实例变量.

我的问题是:选项2是否可能,如果可行,它的开销是多少?(例如,我还在查看O(n)算法来查找类的实例变量吗?)

BJ *_*mer 8

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


Gre*_*ker 5

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

@public允许任何代码这样做.@package将范围限制为与类的实现相同的二进制文件,这通常适用于编写共享库时.