深拷贝一个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
同理也可以深拷贝其他类型