深拷贝一个UILabel
原理还是用到runtime的反射机制和NScopying协议.
extension UILabel:NScopying { public func copy(with zone: NSZone? = nil) -> Any { let label = UILabel() var outCount:UInt32 var propertyArray:[Nsstring] = [Nsstring]() outCount = 0 let peopers:UnsafeMutablePointer<objc_property_t?>! = class_copyPropertyList(UILabel.classForCoder(),&outCount) let count:Int = Int(outCount); for i in 0...(count - 1) { let method = peopers[i] let sel = method_getName(method) let methodName = sel_getName(sel) if let name = methodName { let na:Nsstring = Nsstring.init(utf8String: name)! propertyArray.append(na); } } // 不要忘记释放内存,否则C语言的指针很容易成野指针的 free(peopers) for i in 8...(count - 6) { let name = propertyArray[i] let value = self.value(forKey: name as String) label.setValue(value,forKey: name as String) } return label } }
调用
let labelA = UILabel() let labelB = labelA.copy() as! UILabel同理也可以深拷贝其他类型
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。