为什么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]
那么,为什么Apple在某些库上使用基于C的API?
答案 0 :(得分:6)
性能
答案 1 :(得分:6)
一个可能的原因是表现。
当您向对象发送消息时,编译器会将其转换为对名为objc_msgSend()
的C函数的调用,该函数将您要发送消息的对象,消息和任何参数作为参数。信息。然后,它会查找与该消息对应的实际函数所在的位置,并将控制权传递给它。
我确信Apple已经优化了objc_msgSend
的地狱,因为它经常被调用,但它仍然比简单的函数调用慢得多。
答案 2 :(得分:4)
抽象的一个原因可以在Apple的历史中找到。当Cocoa首次亮相Mac(作为Rhapsody OS中的Yellow Box)时,许多大型开发人员不愿意将其用户界面移植到它上面。因此,当Mac OS X 10.0发布时,现有的Mac Toolbox被清理并与Cocoa一起作为“Carbon”发布。
Carbon和Cocoa有很多功能重叠,因此创建共享的基于C的库非常有意义。虽然Carbon已经普及,但iOS已经出现,而且C库继续对Apple的操作系统之间的抽象有用 - 在AppKit和UIKit之间。
N.B。:根据经验,您应该尝试使用符合您需求的最高级API。例如,如果UIBezierPath
和UIColor
将为您提供您想要的内容,那么您可以(并且可能应该)留在Objective-C花园中,以实现可读性,易于调试和未来的防范。但是,随着功能和性能要求的提高,您可以随时回归到CoreGraphics。同样,如果您需要在应用程序中处理线程化的并发任务,NSOperation
子类是一种干净且一致的方法,但如果您的需求是唯一的,您可以始终回归到GCD {{1方法。
答案 3 :(得分:2)
首先,C
是一种较低级别的语言,开销较小。当您引入对象时,您会引入一些开销来换取在大多数情况下更容易理解的程序结构。
此外,由于iOS和OS X都基于Unix内核,因此Apple API中提供的任何低级操作系统集成都是使用更常用的跨平台语言编写的,如{{ 1}}或者它被写为那些非常相同的C
函数的包装器。在某些时候,Apple的时间不值得为所有事情提供C
包装。