先前的属性在后续调用中传播
Posted
技术标签:
【中文标题】先前的属性在后续调用中传播【英文标题】:Previous attributes propagated on subsequent calls 【发布时间】:2018-01-15 01:14:36 【问题描述】:我遇到了一个奇怪的场景,我的扩展方法生成的先前属性(这是属性字符串的自定义属性)也被分配给后续调用。它的行为就像一个静态值被缓存并在我调用它的任何地方分配它。
extension Model
func attributedString() -> NSAttributedString
// Generate an icon, represented by the type of model
let icon = ...
// Merge both icon and the value of the ziptag
let preferredAttributedString = NSMutableAttributedString(attributedString: icon.attributedString())
let attributedValue = NSAttributedString(string: self.value)
preferredAttributedString.append(attributedValue)
// Mention Attribute
let mentionAttributeKey = NSAttributedStringKey(HKWMentionAttributeName)
guard let mentionAttribute = HKWMentionsAttribute.mention(withText: self.value, identifier: self.id) else
fatalError("mentionAttribute can't be nil")
mentionAttribute.metadata = self.entityMetadata()
// Color Attribute
let foregroundColor = UIColor.blue
// Set the attributes
let attributes: [NSAttributedStringKey : Any] = [mentionAttributeKey : mentionAttribute,
NSAttributedStringKey.foregroundColor : foregroundColor]
preferredAttributedString.addAttributes(attributes, range: preferredAttributedString.range)
return preferredAttributedString
这就是我复制它的方式。假设我确实有两个模型类型的对象,它们具有上面声明和实现的扩展方法。
let modelA = Model()
let modelB = Model()
let attributedStringA = modelA.attributedString()
let attributedStringB = modelB.attributedString()
我已经记录了上面的两个属性字符串,我希望它会分别显示 modelA
和 modelB
属性,但它只会在两个属性字符串上生成 modelA
添加更多关于问题的数据。上面生成的图标是一个自定义字体FontAwesome,它也将生成一个属性字符串并添加到Model
的属性字符串之前(使用系统的字体)。
我已经在产生所需属性的语句上运行了 Xcode 的 lldb,它的报告是正确的;但是一旦我在属性字符串上分配了属性,就开始出现上述问题
【问题讨论】:
扩展?创建一个类。 是的,这是Model
类的扩展。您的意思是创建一个接受Model
并生成属性字符串的类吗?
可能HKWMentionsAttribute.mention
和self.entityMetadata()
正在返回静态数据.. 或者Model
有静态数据或相同的值.. 我们不知道,但上面的sn-没有问题页。到目前为止,我可以看到您通过相同的构造函数分配了相同的模型,没有不同的数据..
HKWMentionsAttribute
和 Model
都没有任何 static
实现 HKWMentionsAttribute.h Declaration HKWMentionsAttribute.m Implementation
@Brandon 我已经删除了扩展的实现并创建了两个使用模型的类。 ClassA
生成属性字符串,ClassB
生成属性字符串所需的图标。我让 Xcode 的调试器 (LLDB) 运行语句并生成正确的属性。
【参考方案1】:
我通过在我的问题的 sn-p 上添加一个未使用的自定义属性来修复它
// Mention Attribute
let mentionAttributeKey = NSAttributedKey(HKWMentionAttributeName)
let mentionAttribute = ....
// Foreground Color
let foregroundColor = UIColor.blue
// Trash Attribute
let trashAttributeKey = NSAttributedKey("TrashAttribute")
let trashAttribute = Trash()
添加垃圾属性后,现在可以完美运行了;因为这个扩展方法之前没有更多的挥之不去的属性,以前专门在 Attributed String 的 Icon 部分
【讨论】:
以上是关于先前的属性在后续调用中传播的主要内容,如果未能解决你的问题,请参考以下文章