3

iOSの一部のライブラリがCベースのAPIを提供しているのはなぜですか?たとえば、コアグラフィックライブラリは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を使用するのでしょうか。

4

4 に答える 4

7

パフォーマンス

  1. Objective-Cオブジェクトと比較してCのメモリオーバーヘッドが少ないため
  2. Objective-Cランタイムを通過する必要がないため、スピードアップ
于 2013-02-12T19:25:20.080 に答える
6

考えられる理由の1つは、パフォーマンスです。

メッセージをオブジェクトに送信すると、コンパイラーはそれをobjc_msgSend()、メッセージの送信先のオブジェクト、メッセージ、およびメッセージへのパラメーターをパラメーターとして受け取るという名前のC関数の呼び出しに変換します。次に、そのメッセージに対応する実際の関数がどこにあるかを調べて、制御を渡します。

Appleはobjc_msgSend頻繁に呼び出されるので、地獄を最適化したと確信していますが、それでも単純な関数呼び出しよりもはるかに遅くなります。

于 2013-02-12T19:30:28.417 に答える
4

抽象化の理由の1つは、Appleの歴史にあります。Cocoaが(Rhapsody OSのイエローボックスとして)Macでデビューしたとき、多くの大規模な開発者は、ユーザーインターフェイスをCocoaに移植することを望んでいませんでした。その結果、Mac OS X 10.0が出荷されたときに、既存のMac Toolboxがクリーンアップされ、Cocoaと一緒に「Carbon」としてリリースされました。

CarbonとCocoaには多くの機能の重複があったため、共有のCベースのライブラリを作成することは非常に理にかなっています。Carbonの人気は低下しましたが、iOSが登場し、CライブラリはAppleのオペレーティングシステム間(AppKitとUIKit間)の抽象化に引き続き役立ちます。


注意:経験則として、ニーズを満たす最高レベルのAPIを使用するようにしてください。たとえば、必要なものが提供される場合は、読みやすさ、デバッグのしやすさ、将来性を確保するために、Objective-CガーデンUIBezierPathUIColorとどまることができます(おそらくそうすべきです)。ただし、機能とパフォーマンスの要件に応じて、いつでもCoreGraphicsにフォールバックできます。同様に、アプリ内でスレッド化された並行タスクを処理する必要がある場合、NSOperationサブクラスはクリーンで一貫性のある方法ですが、ニーズが一意である場合は、いつでもGCDdispatch_()メソッドにフォールバックできます。

于 2013-02-12T20:58:32.003 に答える
2

一つにCは、オーバーヘッドの少ない低水準言語です。オブジェクトを導入するときは、ほとんどの状況で従うのが簡単なプログラム構造と引き換えに、少しオーバーヘッドを導入します。

また、iOSとOS XはどちらもUnixカーネルに基づいているため、Apple APIで提供される低レベルのOS統合は、次のようなより一般的に使用されるクロスプラットフォーム言語Cで記述されるか、次のように記述されます。それらのまったく同じC関数のラッパー。ある時点で、Objective-Cすべてにラッパーを提供することはAppleの時間の価値がありません。

于 2013-02-12T19:28:47.503 に答える