Objective C 共享类的只读实例

Posted

技术标签:

【中文标题】Objective C 共享类的只读实例【英文标题】:Objective C shared readonly instance of class 【发布时间】: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 &&...)。这不能回答您的问题,但可能是解决您问题的更清洁和更快的解决方案:) 【参考方案1】:

常见的解决方案是让所有实例不可变(参见NSNumberNSDecimalNumber 等),可能还有第二个可变类(NSString vs NSMutableStringNSArray vs NSMutableArray)。

【讨论】:

【参考方案2】:

取决于您的标准向量应该如何工作。如果您不想通过属性设置 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 用于所有其他。

【讨论】:

【参考方案3】:

您是否只想阻止其他类更改此类字段?

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

另请参阅related question about Obj-C private fields。

【讨论】:

以上是关于Objective C 共享类的只读实例的主要内容,如果未能解决你的问题,请参考以下文章

多处理只读共享内存

Objective C 类扩展 - 如何用 readwrite 方法覆盖只读?

Objective C Delegate - 查找父类的名称

objective-c 单例

在组合项目中从Swift类访问Objective-C类中的singleton sharedInstance

Objective-C