3

Objective C でクラスの読み取り専用インスタンスを作成したいと考えています。基本的に x と y の位置といくつかのメソッドに対して浮動小数点であるベクトル クラスがあります。多くの場合、(0, 0)-ベクトルが必要なので、毎回新しいベクトルを割り当てるのではなく、次のようなゼロ ベクトルを共有することを考えていました。

// Don't want to do this all the time (allocate new vector)
compare(v, [[Vector alloc] initWithCartesian:0:0]);

// Want to do this instead (use a shared vector, only allocate once)
compare(v, [Vector zeroVector]);

// My attempt so far
+ (Vector *)zeroVector {
    static Vector *sharedZeroVector = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedZeroVector = [[self alloc] initWithCartesian:0:0];
    });
    return sharedZeroVector;
}

// The problem
v.x = 3;

これは問題なく動作しますが、ゼロ ベクトルが読み取り専用ではないことを除けば、ばかげているように感じます。注意として、これは実際の問題というよりも、知りたい方法の質問であることに言及したいと思います。実際に違いが生じるかどうかはわかりません。

4

3 に答える 3

5

一般的な解決策は、すべてのインスタンスを不変にし ( などを参照) NSNumberNSDecimalNumber場合によっては 2 番目の可変クラス ( NSStringvsNSMutableStringまたはNSArrayvs NSMutableArray) を持つことです。

于 2013-04-17T14:40:43.343 に答える
4

標準ベクトルがどのように機能するかによって異なります。プロパティを介して x と y を設定したくない場合は、それらを読み取り専用にすることができます。

@property (nonatomic, readonly) NSInteger x;
@property (nonatomic, readonly) NSInteger y;

ベクトルの一部を読み書き可能にする必要がある場合は、読み取り専用クラスの Vector を作成し、クラス MutableVector を派生させることができます。

@interface Vector : NSObject
  @property (nonatomic, readonly) NSInteger x;
  @property (nonatomic, readonly) NSInteger y;
@end

@interface MutableVector : Vector
  @property (nonatomic) NSInteger x;
  @property (nonatomic) NSInteger y;
@end

次に、Vector を zeroVector に使用し、MutableVector をその他すべてに使用します。

于 2013-04-17T15:05:32.147 に答える
0

他のクラスがこのクラス フィールドを変更できないようにしたいだけですか?

それらを@privateand (Sulthan が書いているように) としてマークし、-zeroVectorメソッドが返すクラスが不変 (おそらく の不変サブクラスVector) であることを確認します。つまり、他のコードがその状態を変更できるようにするメソッドはありません。

Obj-C プライベート フィールド に関する関連する質問も参照してください。

于 2013-04-17T15:02:25.247 に答える