为什么iOS中的某些库是由基于C的API提供的?

Jon*_*eon 3 core-graphics objective-c ios

为什么iOS中的某些库提供了基于C的API?例如,Core Graphics库由基于C的API提供.但是,我无法理解Apple之所以这样做的原因.

而且,[[UIColor red] setStroke]drawRect中的那种代码:也让我感到困惑!如果Apple决定使用基于C的API,为什么他们使用面向对象的样式代码来做图形事情呢?

并且CGContextAddLineToPoint(),例如,进行论证CGContextRef c.我认为它完全适合使用面向对象的东西.

// current
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, 10, 10);

// looks better
CGContext *context = [UIGraphics getCurrentContext]
[context moveToPoint: CGMakePoint(0, 0)] // or [context moveToPointX: 0 y: 0]
[context addLineToPoint: CGMakePoint(10, 10)]  // or [context addLineToPointX: 10 y: 10]
Run Code Online (Sandbox Code Playgroud)

那么,为什么Apple在某些库上使用基于C的API?

Glo*_*mad 7

性能

  1. 因为与Objective-C对象相比,C中的内存开销更少
  2. 加速,因为不需要经历Objective-C运行时

  • 此外,这允许呼叫者在C中,这允许呼叫者在需要时具有最高性能.但是,作为一个注释,CoreFoundation对象与ObjC对象大小相同,因此它通常不是内存开销问题. (3认同)

Fer*_*cio 6

一个可能的原因是表现.

当您向对象发送消息时,编译器会将其转换为对名为C函数的调用,该函数将objc_msgSend()您要发送消息的对象,消息和消息的任何参数作为参数.然后,它会查找与该消息对应的实际函数所在的位置,并将控制传递给它.

我确信Apple已经优化了地狱,objc_msgSend因为它经常被调用,但它仍然比简单的函数调用慢得多.