我知道这个想法完全打破了封装,但是说我有以下类扩展:
@interface MyClass () {
int reallyImportantIvar;
}
// ...
@end
通常,类的行为应该在Objective-C层内部 - 发送和接收消息等。但是有一个('公共')子例程,我需要最好的性能和非常低的延迟,所以我会更喜欢使用C方法。当然,如果我这样做,我就再也无法访问 reallyImportantIvar ,这是我性能关键任务的关键。
似乎我有两个选择:
我的问题是:选项2是否可能,如果可以,它的开销是多少? (例如,我还在查看O(n)算法来查找类的实例变量吗?)
答案 0 :(得分:8)
实际上,如果C函数的定义在类的@implementation
块内,那么它可以通过通常的object->someIvar
符号访问该类的私有ivars。因此,当你可以使用运行时来访问它时,我认为你不需要。只需在相关类的@implementation
块中实现该函数,您应该没问题。
答案 1 :(得分:5)
另一种方法是将ivar声明为@package
或@public
。然后在类的实现之外的代码可以#include该类扩展可以使用ivar。
@public
允许任何代码执行此操作。 @package
将范围限制为与类的实现相同的二进制文件,这在编写共享库时通常是合适的。
答案 2 :(得分:1)
Objective-C运行时包含object_getInstanceVariable()
函数。我相信这就是你要找的东西。我没有详细检查,但我不相信以这种方式访问它和正常方式之间有任何重大差异。