这个问题要么不问,要么肯定是需要你回答用过

首先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产生的技术,处理完再调用系统函数,值得注意的是调用系统函数需要调用用自己的函数,因为函数已经改变了

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: