サーチ…


構文

  • typedef struct { タイプA propertyA ; typeB propertyB ; ...} StructName

備考

Objective Cでは、ほとんどの場合、structの代わりにオブジェクトを使うべきです。しかし、構造体を使用する方が良い場合は、次のような場合があります。

  • あなたが(構造体)型の値をたくさん作成して破壊しようとするときには、良い性能と小さなメモリの使用が必要です
  • 構造体は、オブジェクトのメソッドを呼び出すときに実行時にメソッドを決定する必要があるため、作成と使用が高速になります
  • Structsは、オブジェクトがクラスを保持する追加のプロパティisa持つため、サイズが小さくなります
  • 値に2つのプロパティと小さな合計サイズがある場合( CGSize取る;それはそれぞれ4バイトである2つの浮動小数点を持ち、8バイトを取ることができる)、たくさん使用されます(最初の点)
  • ユニオンビットフィールドを使用することができ、重要なことに、小さなメモリ使用量が必要なために保存されたサイズが必要な場合(最初の点で結びつきます)
  • Objective-CオブジェクトはC配列を直接格納することができないので、 実際に構造体の内部に配列を格納したいとき。ただし、Objective-Cオブジェクトの配列を参照(つまり、C配列type[]代わりにtype *type *することによって、間接的に配列を取得することは可能です
  • ライブラリなどの他のコードと通信する必要がある場合は、C言語で記述されています。構造体はC言語で完全に実装されていますが、オブジェクトはそうではありません

CGPoint

構造体の1つの本当に良い例はCGPointです。これは2次元の点を表す単純な値です。 2つのプロパティxy持ち、次のように書くことができます。

typedef struct {
    CGFloat x;
    CGFloat y;
} CGPoint;

これまでにObjective-Cを使ってMacやiOSアプリケーションを開発していたのであれば、ほぼ確実にCGPoint出くわしCGPointCGPointは、ビューとコントロールからゲーム内のオブジェクトまで、グラデーション内の変化まで、画面上のすべての位置を保持します。これはCGPointが多く使われていることを意味します。これは本当にパフォーマンスの重いゲームではさらに真実です。これらのゲームは多くのオブジェクトを持つ傾向があり、これらのオブジェクトのすべては位置を必要とします。これらの位置は、 CGPointや、ポイントを伝える他のタイプの構造体(3Dゲームの3次元点など)です。


CGPointような点は、以下のようなオブジェクトとして簡単に表現できます。

@interface CGPoint {
    CGFloat x;
    CGFloat y;
}

... //Point-related methods (e.g. add, isEqualToPoint, etc.)

@property(nonatomic, assign)CGFloat x;
@property(nonatomic, assign)CGFloat y;

@end

@implementation CGPoint

@synthesize x, y;

...

@end

しかし、 CGPointをこのように使用すると、ポイントの作成と操作に時間がかかります。小さくて速いプログラムでは、実際には違いは生じません。そのような場合は、オブジェクトポイントを使用するのがよいでしょう。しかし、ポイントを多く使う大規模なプログラムでは、オブジェクトをポイントとして使用すると、パフォーマンスが低下し、プログラムが遅くなり、メモリが浪費され、プログラムがクラッシュする可能性があります。

構造体の定義と構造体メンバーへのアクセス

struct文の書式は次のとおりです。

struct [structure tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables]; 

例:ThreeFloats構造体を宣言する:

   typedef struct {
    float x, y, z;
} ThreeFloats;

@interface MyClass
- (void)setThreeFloats:(ThreeFloats)threeFloats;
- (ThreeFloats)threeFloats;
@end

MyClassのインスタンスをmyClassメソッドthreeFloatsを呼び出し、NSValueにラップされた結果を返すように、パラメータ "@ threeFloats"を使用してvalueForKey:というメッセージを送信します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow