2012-03-02 3 views
3

Objective-CプロジェクトでCスタイルの構文を見つけるのが混乱しています(たとえば、以下の構文はObjective-Cでメソッドが定義されている方法ではありません)。私はエラーなしでコンパイルしたコード以来これが動作することは明らかですが、どうやって、なぜこのコードは普通のObjective-C .h、 .mファイルです。誰かがこれがどのようにして説明できるか?Objective-CコードをCスタイルの構文で記述できますか?

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
//use of round brackets 

void drawLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, 
CGColorRef endColor); 
// C style syntax for passing params 

もこれは私がこれまで見てきたコアグラフィックスコードの周りに非常に具体的で、それは... CGコードでこのもまたはファイルだけのような定期的なObjective-Cのメソッドを書くことが許されているのですか?

答えて

4

のObjective-Cは同じで、Cのちょうどスーパーセットであり、それはCで書かれていることを意味しますC++のように。 Objective-Cのメソッド呼び出しは、C関数objc_msgSend()(およびその変種)への呼び出しに変換され、それを直接呼び出すことは可能です(面倒ですが)。

血みどろの詳細はここで綴られています。Objective-Cの、純粋なCの組み合わせのコードを書くときに

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

+0

は、親指の任意のガイドラインやルールがあります。 (例えば、メモリ管理、キャスティング)など – dotnetcoder

+0

とは、私はobjective-cクラスを書くことができ、その中にc-styeメソッドを持つことができます。 – dotnetcoder

+0

すべてのObjective-Cコードがそのような "ミックス"であるため、Objective-Cのルールを超えたものはありません。 Obj-Cオブジェクトは通常のポインタであり、そのまま扱うことができます。 ARC(https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.htmlを参照)を使用していない場合は、Obj-Cの所有権ルールに注意して使用してください必要に応じてObj-C APIを使用します。たとえば、Obj-Cオブジェクトでfree()を呼び出さない場合は、releaseメソッドを使用します。 – davehayden

3

コアグラフィックスはObjective-CではなくC APIです。 Objective-CはCのスーパーセットなので、有効なCコードはすべて.mファイルでうまくコンパイルされます。

2

Objective-Cは.mファイルで普通の古いC関数を定義できるため、通常のC構文を使用して.mファイルで普通の古いC関数を呼び出すことができます。

CGColorSpaceCreateDeviceRGB関数は単純な古いC関数です。これは、純粋なC APIを持つCore Graphicsフレームワーク(Quartz 2Dとも呼ばれます)の一部です.APIは、Objective-CではなくプレーンCのみを使用します。

一般的な古いC関数構文を使用してObjective-Cオブジェクトメソッドを定義することはできません.Objective-Cメソッド構文を使用する必要があります。また、古いC構文を使用してObjective-Cオブジェクトにメッセージを送信しないでください。Objective-Cメッセージ送信構文(角括弧)を使用する必要があります。

0

objcは、objcプロジェクトでcコードを見つける理由を標準Cにサポートしています。それはcoreプレフィックスを有する場合

は、Appleによって提供されるフレームワークとしては、CGのようcore graphic放置し、それは通常

関連する問題