2015-01-04 9 views
8

これは私が参照してるものです:objc_msgSendあなたはObjective-Cのメッセージを送信すると、Cレベルで何が起こっているか、本質的であり、この設定はに設定され、私が何を読んでから
enter image description here「objc_msgSendコールの厳密なチェックを有効にする」とはどういう意味ですか?

Yesは、送信されるメッセージの受信者が期待しているのと同じ数の引数を持つことを保証します。

これは間違いありませんか?また、これをYesまたはNoに設定するとどのような長所と短所がありますか?開発時にはYesに設定し、運用時にはNoに設定する必要がありますか?

+1

Cocoapodsはこのそのポッドのそれぞれについて、デフォルトで有効になっているので、それはそうです。これはデフォルトでどのようにオフにすることができますか? – fatuhoku

答えて

6

あなたは本質的に正しいです、はい。

Appleはエラーをより早く見つけ出すために、デフォルトでYesに設定しています。これをNoに設定する唯一の理由は、このオプションで完全にコンパイルするように更新されていないレガシーコードをコンパイルしているためです。

"objc_msgSend呼び出しの厳密なチェックを有効にする"は、コンパイル時のチェックであり、実行時ではないため、本番環境ではオフにするメリットはありません。

6

Appleのウェブサイトにはpresentation「LLVMの新機能」があります(プレゼンテーションのテキストはhereです)。

コンパイラは、(オプションで)obj_msgSendへの呼び出しの種類を厳密にチェックするように見えます。 objc_msgSendを直接呼び出す代わりに、正確に型付けされた関数ポインタを使用します。与えられた

例:

#include <objc/message.h> 
void foo(void *object) { 
    typedef void (*send_type)(void *, SEL, int); 
    send_type func = (send_type)objc_msgSend; 
    func(object, sel_getUid("foo:"), 5); 
} 
+4

ああ別の原因不明のdownvote – nielsbot

+0

私ではなかった!私はスライドを見て誰かがそれを説明しなくても少し役に立たなかったので、そのプレゼンテーションがどこにあるのか本当に不思議に思っていました。 –

+0

はい、私はそれを取得します - プレゼンテーションのテキストは、2番目のリンクに転写されます。また、WWDCサイトを介して元のプレゼンテーションを表示することもできます。 – nielsbot

関連する問題