2011-01-13 10 views
0

Objective-CにCの関数が存在するかどうかテストする方法はありますか?私は "respondsToSelector"のようなものを探していますが、Cの関数のためです。Objective-C/iOS - C関数の存在をテストしますか?

具体的には、iOSでは「UIGraphicsBeginImageContextWithOptions(CGSizeサイズ、BOOL不透明>、CGFloatスケール)」の存在をテストしようとしています。

ありがとうございました。

+1

あなたは 'UIGraphicsBeginImageContextWithOptions'が唯一のiOS 4.0以降であることがわかっている場合は、アプリが実行されているiOSのバージョンを確認できます。これは、このようなもののためのより良い方法です。 –

+0

私はそれに反して、それはもっと悪い方法です。可能であれば、バージョンチェックの代わりに使用したい機能をチェックしてください。ここで可能です。 – Ken

+0

私はこのオプションを調べましたが、バージョンの確認はAppleが将来のデバイスの命名規則を変更する可能性があるため問題になります。したがって、アプリがクラッシュする可能性があります。他のS.O.投稿、私は多くのosのバージョンをチェックすることをお勧めしますが見つかりました。思考? – RyanM

答えて

9
if(&UIGraphicsBeginImageContextWithOptions != NULL) 
    UIGraphicsBeginImageContextWithOptions(); 
    else NSLog(@"No UIGraphicsBeginImageContextWithOptions function"); 
+0

ありがとう。これは完全に機能します。 – RyanM

+0

[このドキュメントの記事](https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html#//apple_ref/doc/uid/20002378-106633-CJBGFCAC) 'if(&MyWeakLinkedFunction!= NULL)'ではなく 'if(MyWeakLinkedFunction!= NULL)'です。なぜそのアンパサンドを追加したのですか? –

+0

@IulianOnofrei違いはありません。 C言語では、関数を使わないと関数は自動的にポインタに変換されるので、2つは等価です。 – ughoavgfhw

2

はい、weak linkingのドキュメントを参照してください。

関数を呼び出す前に関数ポインタがNULLであるかどうかを調べることになります。 UIGraphicsBeginImageContextWithOptions以来

+0

これはとても役に立ちました。私はすでに弱いリンクのフレームワークを知っていましたが、そのタイプが関数/ etcに拡張されたことは知らなかった。ありがとう。 – RyanM

1

は、iOS 4.0にのみ存在し、後に、あなたは__IPHONE_OS_VERSION_MAX_ALLOWED macroとiOSのターゲットのバージョンを確認することができます

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 
    UIGraphicsBeginImageContextWithOptions(...); 
#else 
    // Function not available, fail gracefully 
#endif 
+0

これは古い答えですが、 '__IPHONE_OS_VERSION_MAX_ALLOWED'ではなく' __IPHONE_OS_VERSION_MIN_REQUIRED'を意味すると思います。 iOS 5をサポートしているバージョンを使用しているからといって、最小目標が4.0以上であるとは限りません。明らかに、受け入れられた回答のように、またはここで議論されているように、ランタイムチェックがさらに優れています。http://stackoverflow.com/questions/3339722/check-iphone-ios-version – Rob

関連する問題