-1

I try to use a CATextLayer together with a NSMutableAttributedString.

Once I set the string property of my CATextLayer to an NSMutableAttributedString it gets automatically replaced by an immutable NSAttributedString.

I checked for the result of calling class on the string property before and after setting it and the pointer. I hand an NSConcreteMutableAttributedString to the CoreTextLayer and right after the setter is called and I ask the CATextLayer for the class of its string property, I get this result: NSConcreteAttributedString. Also the pointers are different before and after (obviously).

What can I do to get that right?

4

1 回答 1

2

正在发生的事情没有错,所以没有什么可以“正确”的。只看文档!该string属性声明如下:

@property(copy) id string

这正是您所看到的:当您设置它时,它需要一个不可变的副本。这是经过深思熟虑的:如果不是这样,那么字符串可能会在层的背后发生变异,这会使一切都失败。事实上,如果您自己的类有任何字符串属性,它们应该以相同的方式工作。

如果需要更改字符串,只需string重新设置属性即可。如果您需要根据当前值更改字符串,请获取string、制作 a mutableCopy、更改并设置它 - 就像Foundation 中的任何不可变/可变类集群对一样。

类的名称是无关紧要的,我想你已经意识到:它是一个类集群,所以像 NSConcreteMutableAttributedString(而不是 NSMutableString)这样的私有名称与你无关。在任何情况下,您都不应该使用类名作为测试可变 Foundation 类实例是否可变的方法:只需询问对象是否响应可变方法即可。

于 2014-05-10T17:53:28.097 回答