CGPoint的不可替代的替代品?

时间:2014-02-25 17:49:09

标签: objective-c core-graphics immutability cgpoint

正如问题所述,我更喜欢CGPointCGSizeCGRect的不可变版本,尽管我宁愿使用iOS框架支持的类型,避免在类型之间进行转换。

那么,是否有CGPoint支持的不可变版本?如果没有,有什么建议吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用常量CGPoint等。

E.g:

const CGSize size = (CGSize){6.0f, 4.0f};

使用CGSizeMake不会起作用,因为它们不是编译时常量而你不能使用变量,但这是你得到的最接近的不可变CGSize。如果这还不够好,那么你需要使用一个对象并在需要时进行转换。

答案 1 :(得分:1)

当CGPoint(或任何其他结构--CGRect等)是Objective-C对象的属性时,getter / setter方法的机制和C结构的值语义意味着有一定程度的保护间接修改对象的CGPoint属性的值。例如,像someObject.someCGPointProperty.x = 123这样的表达式实际上不会修改x所拥有的CGPoint的someObject值,因为someCGPointProperty访问器将按值返回CGPoint,这意味着你是在CGPoint的副本上设置x值。要实际修改该对象拥有的CGPoint,您需要执行以下操作:

CGPoint point = someObject.someCGPointProperty;
point.x = 123;
someObject.someCGPointProperty = point;

关于对你创建的实例数量的控制:因为CGPoint是一个结构,它通过值 - 有效地复制 - 在函数参数或Objective-C消息中传递。所以无论如何都会有大量的结构移动。但是,这些结构是在堆栈上创建的,而不是堆,并且CGPoint只有16个字节(在32位iOS设备上可能更小?),因此您需要担心任何性能影响。

另外,请参阅@ hypercrypt关于const值的更简洁的答案,因为这可能会很好地解决您的意图。

答案 2 :(得分:1)

您可以使用NSValue包装器类。它可以包装一个点,一个大小,一个矩形等等。它是不可变的,所以无论你在里面存储它都无法改变(请记住,如果存储指针,仍然可以更改点的存储区域)。

示例

NSValue* value= [NSValue valueWithCGPoint: CGPointMake(x,y)];

如果您尝试设置value.CGPointValue.x或y,则会出现编译错误。 getter只返回对象中保存的CGPoint的副本,因此无法更改其值。