在 Objective-C 代码中,有时会遇到定义里不含 * 的变量,他们可能会使用 “栈空间” (stack space)。这些变量所保存的不是 Objective-C 对象。比如 CoreGraphics 框架中的 CGRect :
CGRect frame;
frame.origin.x = 0.0f;
frame.origin.y = 10.0f;
frame.size.width = 100.0f;
frame.size.height = 50.0f;
CGRect 是 C 结构体,其定义是:
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
整个系统都在使用这种结构体,因为如果改用 Objective-C 对象来做的话,性能会受影响。与创建结构体相比,创建对象还需要额外开销,例如分配和释放堆内存等。如果只需保存 int float double char 等 “非对象类型 ”(nonobject type),那么通常使用 CGRect 这种结构体就可以了。
总结
Objective-C 为 C 语言添加了面向对象特性,是其超集。 Objective-C 使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型。接收一条消息之后,究竟应执行何种代码,由运行期环境而非编译器来决定。 (思考1)
思考1
为什么 Objective-C 要使用动态绑定的消息结构?
使用动态绑定有什么优势?
Objective-C 语言相比 C 语言具备了哪些优点?缺点呢?
网友评论