3

プロジェクトで頻繁に使用するカスタムクラスがあります。このクラスにはいくつかのメソッドがありますが、すべてのプロジェクトですべてが使用されるわけではありません。

私の質問は、このクラスをプロジェクトに含めると、プロジェクトが役に立たないコードで肥大化するのでしょうか、それともコンパイラーに使用されるメソッドだけが含まれるのでしょうか。

つまり、クラスに30のメソッドがあり、特定のプロジェクトで4つだけが使用されている場合、コンパイラーには、他の未使用の26のメソッド、または最終製品で使用される4つのメソッドも含まれますか?

すべてが含まれている場合、未使用のメソッドを無視してバイナリを最小限にトリミングするように強制する方法はありますか?

4

4 に答える 4

4

他の26のメソッドにコードが含まれている場合、@implementationはい、それらは最終製品で使用されます。

その理由は、ランタイムシステムのためです。コンパイル時にその26のメソッドを使用しなかったとしても、実行時にそれらが参照されないという保証はありません(とを覚えておいNSSelectorFromString-performSelector:ください)。

これらのコードを強制的に削除する方法があるかどうかはわかりません。(-dead_strip動作しません。)

于 2010-02-26T16:04:09.577 に答える
4

リンカはデッドストリッピングをサポートしています。未使用のコードをオンにしても、肥大化は発生しません。

Appleドキュメントから:

静的リンカー(ld)は、実行可能ファイルからの未使用のコードとデータブロックの削除をサポートします。このプロセス(デッドコードストリッピングと呼ばれる)は、実行可能ファイルの全体的なサイズを縮小するのに役立ちます。これにより、実行可能ファイルのメモリフットプリントが削減され、パフォーマンスが向上します。また、未使用のコードが未定義のシンボルを参照している場合(リンクエラーが発生するのではなく)、プログラムが正常にリンクできるようにします。

デッドコードストリッピングは、バイナリから未使用の関数と実行可能コードのみを削除することに限定されません。リンカは、データブロックに存在する未使用のシンボルとデータも削除します。このようなシンボルには、グローバル変数、静的変数、文字列データなどが含まれる場合があります。

デッドコードストリッピングが有効になっている場合、静的リンカーは、ライブシンボルとブロックの初期セットから到達できないコードを検索します。

于 2010-02-26T16:05:12.383 に答える
2

ビッグファットマンマクラスをリファクタリングして名前を変更する必要があるようです。

于 2010-02-27T07:41:21.230 に答える
1

私の質問は、このクラスをプロジェクトに含めると、プロジェクトが役に立たないコードで肥大化するのでしょうか、それともコンパイラーに使用されるメソッドだけが含まれるのでしょうか。

ヘルパークラスのヘッダーと実装を含めることについて話していると思います。これにより、バイナリサイズが増加します。jessecurryが指摘しているように、リンカーは行き止まりのストリッピングをサポートしています。誰かがあなたのバイナリのパブリックAPIとリンクしたい可能性が常にあるので、これは悪いことです(残念ながら、動的リンクはiphoneでは許可されていませんが、他のプラットフォームを検討しているため、これは当てはまりません)。しかし、私はサイズの違いがあまりにも限界的すぎて重要ではないと思います。

サイズに関して最も影響を与えるのは、通常、アプリケーションに含めるリソース(画像、文字列など)です。

于 2010-02-26T16:07:15.047 に答える