【发布时间】:2013-04-10 09:18:09
【问题描述】:
我想在 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;
这很好用,只是零向量不是只读的,这感觉有点傻。作为一个注释,我想提一下,这更像是一个想知道如何做的问题,而不是一个实际的问题,我不知道它是否会产生一些实际的影响。
【问题讨论】:
-
“它不是只读的”是什么意思?仅供参考,就目前而言,您不能执行
[Vector setZeroVector:foo];,因为这尚未实现。 -
一个更简单的解决方法:您可以在矢量类中创建一个 -(BOOL)isZero 方法并在那里检查坐标属性,例如 if (self.x==0 &&...)。这不能回答您的问题,但可能是解决您问题的更清洁和更快的解决方案:)
标签: objective-c