我知道这个想法完全打破了封装,但假设我有以下类扩展:
@interface MyClass () {
int reallyImportantIvar;
}
// ...
@end
通常,该类的行为就像它在 Objective-C 层中应该的那样——发送和接收消息等。但是有一个(“公共(public)”)子例程,我需要最好的性能和非常低的延迟,所以我会更喜欢使用 C 方法。当然,如果我这样做,我将无法再访问 reallyImportantIvar,这是我执行关键任务的关键。
看来我有两个选择:
- 改为将实例变量设为静态变量。
- 通过 Objective-C 运行时直接访问实例变量。
我的问题是:选项 2 是否可行?如果可行,它的开销是多少? (例如,我是否仍在寻找 O(n) 算法来查找类的实例变量?)
最佳答案
实际上,如果C函数的定义在@implementation
内类的 block ,然后它可以通过通常的object->someIvar
访问该类的私有(private)ivars符号。因此,虽然您可以使用运行时来访问它,但我认为您不需要这样做。只需在 @implementation
中实现功能即可问题类的 block ,你应该没问题。
关于objective-c - 在运行时从类外部访问 Objective-C ivar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18939806/