3

我想在Objective C中创建一个类的只读实例。我有一个向量类,它基本上是x和y位置的浮点数和一些方法。在很多情况下,我需要一个 (0, 0)-vector,所以我想而不是每次都分配一个新的,我将拥有一个共享的零向量,如下所示:

// 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),可能还有第二个可变类(NSStringvsNSMutableStringNSArrayvs 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

然后,您将对 zeroVector 使用 Vector,对所有其他人使用 MutableVector。

于 2013-04-17T15:05:32.147 回答
0

你只是想阻止其他类改变这个类的字段吗?

将它们标记为@privateand (如 Sulthan 所写),确保您的-zeroVector方法返回的类是不可变的(可能是 的不可变子类Vector),即没有允许其他代码更改其状态的方法。

另请参阅有关 Obj-C 私有字段的相关问题

于 2013-04-17T15:02:25.247 回答