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