2013-04-17 59 views
3

我想在Objective C中创建一个类的只读实例。我有一个向量类,它基本上是为x和y位置以及一些方法漂浮的。在很多情况下,我需要一个(0,0)维矢量,所以我想的不是分配每一次,我将有一个共享的零矢量一个新的,这样的事情:Objective C共享只读实例类

// 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; 

这工作正常,除了零矢量不是只读的,这感觉很愚蠢。作为一个说明,我想提一提的是,这更像是一个想知道怎么样的问题,而不是一个实际的问题,我不知道它是否会产生一些实际的差异。

+0

你是什么意思“它不是只读”?仅供参考,您**不能**做[Vector setZeroVector:foo];',因为没有实现。 – 2013-04-17 14:37:49

+0

一个更简单的解决方法:你可以在vector类中创建一个 - (BOOL)isZero方法,然后检查coord属性,如if(self.x == 0 && ...)。这不回答你的问题,但可能是一个更清洁,更快的解决方案,您的问题:) –

回答

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用于所有其他作品。

5

常见的解决办法是具有所有实例不可变的(见NSNumberNSDecimalNumber等),可能具有第二可变类(NSString VS NSMutableStringNSArray VS NSMutableArray)。

0

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

它们标记为@private和(如Sulthan写入),确保一流的,你-zeroVector方法返回是不变的(的Vector也许是一个不变的子类),即有没有方法,将允许其他代码来改变它的状态。请参阅related question about Obj-C private fields