objc_getAssociatedObject, objc_setAssociatedObject 是较为常用的 ObjC 运行时方法。利用这两个方法,我们可以很方便地在运行时为 NSObject 及其子类添加属性。 然而,在 Swift 中使用这两个方法的时候,我们需要注意一些细节。否则,我们就有可能会遇到一些麻烦。 如果您不了解在 ObjC 中如何使用这两个方法,Ficow 会...
这里是给UIButton添加一个分类,在分类中给UIButton拓展快速添加点击事件的方法通过block回传,通过objc_setAssociatedObject将block保存,触发点击事件后,通过objc_getAssociatedObject获取之前保存的block发起回调
这段代码的关键点是使用objc_setAssociatedObject来设置关联对象,同时使用objc_getAssociatedObject来获取关联对象的值。还要注意,associatedObjectKey需要是一个唯一的静态变量,以确保每个对象都有其自己的关联属性。 根据你的需求,你可以在.OBJC_ASSOCIATION_RETAIN_NONATOMIC中选择其他关联策略,如.OBJC_ASSOCIATION_ASSIGN、...
static func get(_ key: UnsafeRawPointer) -> T{ return objc_getAssociatedObject(self, key) as! T } static func set(_ key: UnsafeRawPointer,_ newValue : T) { objc_setAssociatedObject(self, key, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } 1. 2. 3. 4. 5...
returnobjc_getAssociatedObject(self,&AssociatedKeys.DescriptiveName)as?String } set{ ifletnewValue=newValue{ objc_setAssociatedObject( self, &AssociatedKeys.DescriptiveName, newValueasNSString?, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC) ) } }
针对范例代码一里面 ObjC associated object 访存得到错误结果的问题,我们可以进入汇编模式,看看到底objc_get(set)AssociatedObject得到的参数是什么。首先打开 Xcode 的 Always Show Disassembly(看完文章后记得关闭哦),在objc_getAssociatedObject和objc_setAssociatedObject打下断点。
Swift 3 使用objc_setAssociatedObject 起初使用runtime添加属性的时候照着OC习惯 objc_setAssociatedObject(self,"sharedInstance","sharedInstance",.OBJC_ASSOCIATION_RETAIN_NONATOMIC)print(objc_getAssociatedObject(self,"sharedInstance")) 结果无论如何都添加不成功,...
/// 获取关联值 /// - Parameter object: 源对象,一般为 self,给谁关联参数,就填入谁 /// - Parameter key: 关键字,相当于一个标识,通过该标识可以拿到值 public func objc_getAssociatedObject(_ object: Any, _ key: UnsafeRawPointer) -> Any? /// 设置关联值 /// - Parameter object: 同上 //...
OBJC_ASSOCIATION_RETAIN_NONATOMIC) } get { return objc_getAssociatedObject(self, &Self.clickEdgeInsetsKey) as? UIEdgeInsets } } override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool { guard let insets = enlargeEdgeInsets else { return super.point(...
// 拓展类extensionPerson{// 用关联对象拓展存储属性privatestaticvarAGE_KEY:Void?// 类型存储属性其实就是全局变量,一个字节足矣,只是放地址值varage:Int{get{objc_getAssociatedObject(self,@Self.AGE_KEY)as!Int}set{objc_setAssociatedObject(self,@Person.AGE_KEY,newValue,.OBJC_ASSOCIATED_ASSIGN)}}} ...