Objective-C中的内联访问器(getter / setter)方法

时间:2016-01-22 02:08:22

标签: objective-c inline accessor

数据封装,或者我喜欢称之为,谁拥有它以及谁需要了解它,构成了许多面向对象的编程。需要知道的人通常会被访问器方法所满足,但如果它们都只是为了读取变量而导致objc_msgsend,那么这些方法就会变得相当昂贵。 C ++使用内联方法回答问题 - 在定义之前使用“inline”关键字,或者在类声明中定义方法,编译器将访问者代码放在调用者的代码中,从而节省与实际函数调用相关的开销。 / p>

class IntWrapper {
public:
   int getInt() { return anInt; }
protected:
   int anInt;
};

类似的语法由Objective-C中的编译器错误奖励。在Xcode中搜索了语言指南(“[面向对象]使用Objective-C编程”),我没有看到任何相关的方法参考“内联”。在Objective-C中有内联这样的东西吗?它被称为其他东西吗?如果有人能指出我参考内联的文档,非常感谢。

使用简单的测试代码:

@interface ClassA : NSObject
{
   int anInt;
}
- (int) anInt;
@end

@implementation ClassA
- (int) anInt { return anInt; }
@end

并查看使用它的代码的程序集,它看起来像是大约25条指令。

1 个答案:

答案 0 :(得分:3)

动态调度所有Objective-C方法。它们可以被子类覆盖。它们甚至可以在运行时(“swizzled”)由Objective-C运行时API替换。

在某些方面,它们类似于C ++中的virtual方法。

因此无法内联。

顺便说一下,你引用的技术违反了你引用的原则(“谁拥有它,谁需要了解它?”)。将实现放在类声明中会向不需要知道它的客户端公开实现细节。此外,编译器将代码内联到客户端可防止实现在没有重新编译的情况下进行更改,即fragile base class problem。现代Objective-C避免了脆弱的基类问题,这意味着框架类可以在不破坏客户端的情况下更改它具有的实例变量。