这个问题要么不问,要么肯定是需要你回答用过
首先Runtime是一种运行时编程技术,所谓运行时编程就是在程序运行过程中动态的增删改查一些类,属性,变量等等,比如KVO就是一种运行时技术,他在添加监听的时候动态的创建了一个类,后面的设置会通过新类重写的set方法进行
1.给已有的类添加属性
OC面试题 - 给类添加个属性_yokan_de_s的博客-CSDN博客
我之前已经写过了,是利用关联对象和全局变量完成
2.动态解析json数据
一般写程序的时候难免要把JSON字符串转换成model,但是传统的方法很繁琐,要一个属性一个属性的转,但如果能获取到属性列表就能动态转换了,比如
import Foundation
//https://blog.csdn.net/oman001/article/details/79063278 数据借用地址
let jsonStr = """
{
"subject": "荔枝新闻3.0:不止是阅读",
"summary": "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。",
"cover": "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG",
"pic": "",
"format": "txt",
"changed": "2015-09-22 16:01:41"
}
"""
class Sites : NSObject
{
@objc var subject: String
@objc var summary: String
@objc var cover: String
@objc var pic: String
@objc var format: String
@objc var changed: String
override var description: String
{
"\(self.subject),\(self.summary),\(self.cover),\(self.pic),\(self.format),\(self.changed)"
}
override required init() {
(subject,summary,cover,pic,format,changed) = ("","","","","","")
}
}
extension NSObject
{
static func ModelFromjsonStr(jsonStr:String) -> Self
{
let dict = try? JSONSerialization.jsonObject(with: jsonStr.data(using: .utf8)!, options: .mutableContainers)
let dic = dict as! NSDictionary
var count:UInt32 = 0
let ivars = class_copyIvarList(Self.self, &count)
let obj = Self.init()
for i in 0.. { if let ivar = ivars?[Int(i)] { if let cStr = ivar_getName(ivar) { let name = String.init(cString: cStr) obj.setValue(dic[name]!, forKey: name) } } } return obj } } let model = Sites.ModelFromjsonStr(jsonStr: jsonStr) print(model) 后续只要继承NSObject就可以实现这个函数,不过Swift是静态语言,如果不继承NSObject属性上加@objc,这个函数是用不了的 3.系统方法交换 void method_exchangeImplementations(Method m1, Method m2); 就不具体展示了,比如交换一些setobject atindex,然后自己处理一下,或者setObject什么的,如果是nil就跳过什么的,是一种防止bug产生的技术,处理完再调用系统函数,值得注意的是调用系统函数需要调用用自己的函数,因为函数已经改变了 精彩文章
发表评论