我刚刚开始在苹果上进行 GUI 编程(到目前为止,框架看起来不错,但我发现文档的信息量远不如其他文档...Qt、.Net、java 等)。
我遇到的问题之一是了解谁拥有什么。例如,如果我调用 CTLineRefCreateWithAttributedString,生成的 CTLineRef 是否拥有属性字符串?如果属性字符串是可变的并且我更改了它怎么办?这会弄乱 CTLineRef 吗?
该文档缺乏启发性。
CTLineRef 的引用没有提供有关该主题的信息: https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CTLineRef/Reference/reference.html
一些示例不会释放该字符串,我将其视为它被拥有的指示符: https://developer.apple.com/library/mac/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Operations/Operations.html
一些示例确实释放了该字符串,这表明它没有释放: https://developer.apple.com/library/mac/#samplecode/CoreAnimationText/Listings/VectorTextLayer_m.html
(这个不是苹果,但他似乎更了解他们我) http://www.cocoanetics.com/2011/01/befriending-core-text/
那么字符串是否被复制?如果我使用 CFMutableAttributedStringRef 我可以更改它吗(我假设我之后必须创建一个新的 CTLineRef)?
这是一个具体的例子,但这是我在无数地方遇到的问题。任何帮助将非常感激。我觉得一定有一些规则来管理这些事情,但我一点也不知道这些规则是什么,也不知道在哪里可以找到它们。
最佳答案
您寻求的管理规则可以在 Core Foundation Memory Management Guide 中找到。 。需要注意的要点是,您实际上不需要知道 CTLineRef 是否拥有属性字符串。任何对象都可以有多个所有者。您需要担心的只是您是否拥有字符串,以及您最适合放弃所有权的地方在哪里。如果您在创建 CTLineRef 后完成了它,则可以随意释放它。
将其余部分视为 CTLineRef 的实现细节。如果 CTLineRef 遵循该文档中规定的规则(确实如此)并且需要保留属性字符串,那么它将在内部保留它。它也有可能在内部制作一个副本(这很可能),因此不再关心原始版本。也许它将字符串发送到火星上的服务器,并在以后每次需要时查询它(可能性较小)。重要的一点是,无论它做什么,如果您不再需要它,您可以安全地释放该字符串。
至于可变性和复制行为,那就有点模糊了。你是对的,文档没有明确说明该行为。文档明确指出该对象是不可变的。这意味着几乎可以保证它实际上会复制输入字符串(或将其内容解析为其他内容)。人们普遍理解的最佳实践是,对象应该始终复制输入字符串,原因正是您提到的——实现无法知道提供的字符串是否实际上是可变的。为了使实现保持稳健,它需要确保其内部状态不能被外部世界改变。保证这一点的唯一方法是复制字符串。即使对于可变类也是如此,但 CTLineRef 则不然。
关于objective-c - CTLineRef 是否拥有属性字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11799269/