0

Kobold2D サンプル プロジェクト (直交タイル ベースのゲーム) でコードをいじっていて、次のことに気付きました。

@interface TileMapLayer : CCLayer //Map
{
    float tileMapHeightInPixels; //depricated@interface TileMapLayer()  
}
@end

TileMapLayer.h ファイル、および:

@interface TileMapLayer()
@property (strong) HUDLayer *hud;
@property (strong) CCTMXTiledMap *tileMap;
@property (strong) CCTMXLayer *background;
@property (strong) CCTMXLayer *foreground;
@property (strong) CCTMXLayer *meta;
@property (strong) CCTMXLayer *base;
@property (strong) CCSprite *player;
@property (strong) CCSprite *playerTurret;
@property (assign) int money;
@end

TileMapLay.m ファイルで。

私はいつも、ファイルに.hはインターフェースがあり、.mファイルには実装が格納されていると思っていました

誰かが彼らの目的を説明してもらえますか (基本から始めて、私はまだ Objective C を学んでいます)、上記の 2 つの例の目的の違いは何ですか?

4

3 に答える 3

1

まず、.mObjective-C ファイル (Objective-C と C の両方を含むことができます) であり.c、C コードのみを含むことができるプレーン C ファイルであることに注意してください。どちらも.hヘッダーの拡張子を採用しています。

Objective-C に関しては、.mファイルはクラス拡張@interface TileMapLayer()を宣言します。クラス拡張機能は、ファイルで既に宣言されているクラスに ivar とプロパティを追加できます。拡張機能は、それ自体のファイル内からのみ表示できます。ファイル内で拡張子を宣言するのはあまり意味がありませんが、必要に応じて宣言できると思います。.h.m.h

.h目的に関しては、インターフェイスを無駄なくクリーンに保つために必要な最小限のプロパティを宣言することをお勧めします。クラス内でのみ必要なプロパティについては、.mファイルの拡張子で宣言できます。私の個人的な好みは、ivar を明示的に宣言して使用することをまったく避けることです (プロパティ セッターまたはゲッターをオーバーライドする場合を除きます)。そのようにすると、実装時にどの変数が関数またはオブジェクト プロパティに対してローカルであるかが一目でわかるからです。通常、オーバーヘッドはごくわずかであり、時期尚早に最適化するよりも、読みやすさのためにコーディングすることを好みます。最近導入された自動合成プロパティにより、多くの定型コードも節約できます。

私が推奨する戦略は、どのプロパティをオブジェクトの外部から変更可能にするか、または変更できないかを慎重に検討することです。readonlyファイルのように、変更不可のプロパティを宣言し.hます。次に、オブジェクト自体からの操作の拡張readwriteとして、それらを再宣言できます。これにより、あなたや同僚が間違いを犯したり、オブジェクトの外部から変更されるべきではないプロパティを変更したりすることがなくなります。ある意味では、オブジェクトのロジックを内部に保持するのに役立ちます。すべてを宣言するという罠(デフォルト) は避けるようにしています。.m readonlyreadwrite

于 2013-07-18T23:54:43.710 に答える