[对象方法]与CGRectMake或NSRangeMake之间的区别

时间:2016-11-14 16:55:27

标签: objective-c

我知道调用像[object theMethod]这样的方法实例是一个消息,要求执行一个动作(一个名为theMethod的方法)。

Apple的documentation对CGRectMake没有帮助。

例如:

当向实例发送消息时,编译器会转换消息表达式:

[receiver message]

调用消息传递函数 objc_msgSend 。 此函数将接收者和消息中提到的方法的名称(即方法选择器)作为其两个主要参数:

objc_msgSend(receiver, selector)

消息中传递的任何参数也会传递给objc_msgSend:

objc_msgSend(receiver, selector, arg1, arg2, ...)

但是CGRectMake怎么样?该功能位于何处?调用函数时的主要区别(过程)是什么?

更新:内存怎么样?例如,在堆栈中创建块。那么CGRectMake呢?

1 个答案:

答案 0 :(得分:6)

方法和“普通函数”之间的区别是Objective-C是一个相对简单的C包装器的可悲结果。一些被认为太轻量级而无法实现的类型是使用struct s或其他实现的更原始的类型,并伴随着普通的C函数或宏来处理它们。您可以在Xcode中按住Command键单击函数名称以查看声明和定义:

// CoreGraphics / CGGeometry.h
struct CGRect {
    CGPoint origin;
    CGSize size;
};
typedef struct CGRect CGRect;

CG_INLINE CGRect
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
  CGRect rect;
  rect.origin.x = x; rect.origin.y = y;
  rect.size.width = width; rect.size.height = height;
  return rect;
}

至于呼唤差异,你大多已经知道了。消息被转换为objc_msgSend,而诸如CGRectMake之类的函数是普通的C函数或具有通常语义的宏。