0

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

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

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

看来我有两个选择:

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

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

4

3 回答 3

8

实际上,如果 C 函数的定义在@implementation类的块内,那么它可以通过通常的符号访问该类上的私有 ivars object->someIvar。因此,虽然您可以使用运行时来访问它,但我认为您不需要这样做。只需在相关类的块中实现该功能@implementation,就可以了。

于 2013-09-22T06:41:05.577 回答
5

另一种选择是将 ivar 声明为@packageor @public。然后在你的类的实现之外的代码可以#include 类扩展可以使用ivar。

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

于 2013-09-23T04:02:47.863 回答
2

Objective-C 运行时包含该object_getInstanceVariable()函数。我相信这就是你要找的。我没有详细检查过,但我认为以这种方式访问​​它与正常方式之间没有什么大的区别。

于 2013-09-22T03:02:55.727 回答