Runtime关联引用

当我们在开发过程中对系统类扩展时,会发现无法扩展属性。如果想扩展属性,可使用Runtime扩展。

1 相关方法

其中涉及到的Runtime方法有如下三个。

/// 设置值
///
/// - parameter object : self
/// - parameter key : 属性
/// - parameter value : 值
/// - parameter policy : 存储策略objc_AssociationPolicy
///
/// - returns: void
public func objc_setAssociatedObject(object: AnyObject!, _ key: UnsafePointer<Void>, _ value: AnyObject!, _ policy: objc_AssociationPolicy)


/// 获取值
///
/// - parameter object : self
/// - parameter key : 属性
///
/// - returns: AnyObject
public func objc_getAssociatedObject(object: AnyObject!, _ key: UnsafePointer<Void>) -> AnyObject!

/// 去掉所有管理属性
///
/// - parameter object : self
///
/// - returns: void
public func objc_removeAssociatedObjects(object: AnyObject!)

2 实战演练

2.1 扩展属性

下面为YJUser扩展name属性。

//
//  YJUser.swift
//  Runtime
//
//  CSDN:http://blog.csdn.net/y550918116j
//  GitHub:https://github.com/937447974/Blog
//
//  Created by yangjun on 16/1/11.
//  Copyright © 2016年 阳君. All rights reserved.
//

import Cocoa

/// 用户
class YJUser: NSObject {

}

/// 扩展
extension YJUser {

    /// 用户名
    var name: String {
        get {
            return objc_getAssociatedObject(self, "extensionName") as! String
        }
        set {
            objc_setAssociatedObject(self, "extensionName", newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_COPY)
        }
    }

    /// 清空所有关联属性
    ///
    /// - returns: void
    func cleanParameter() {
        // 此时再获取关联属性的值,会报错
        objc_removeAssociatedObjects(self)
    }
}

2.2 测试

//
//  main.swift
//  Runtime
//
//  CSDN:http://blog.csdn.net/y550918116j
//  GitHub:https://github.com/937447974/Blog
//
//  Created by yangjun on 16/1/11.
//  Copyright © 2016年 阳君. All rights reserved.
//

import Foundation

let user = YJUser()
user.name = "阳君"
print(user.name)
user.cleanParameter()
print(user.name)

 


Appendix

Sample Code

Runtime

Objective-C Runtime Reference

Revision History

时间描述
2016-01-11博文完成

CSDN:http://blog.csdn.net/y550918116j

GitHub:https://github.com/937447974/Blog

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值