项目作者: mazhengguang

项目描述 :
iOS知识点总结》》》》》》》》》runtime使用场景======场景1(动态给分类添加属性);场景2(方法的交换swizzling);场景3(字典转模型);场景4(获取所有的私有属性和方法);场景5(对私有属性修改);场景6(归档:解档);场景7(动态的添加方法)
高级语言:
项目地址: git://github.com/mazhengguang/runtime-.git
创建时间: 2017-09-18T07:12:29Z
项目社区:https://github.com/mazhengguang/runtime-

开源协议:

下载


runtime-

runtime使用场景======场景1(动态给分类添加属性);场景2(方法的交换swizzling);场景3(字典转模型);场景4(获取所有的私有属性和方法);场景5(对私有属性修改);场景6(归档:解档);场景7(动态的添加方法)

GCD-

class ViewController: UIViewController {

  1. private static var once = ViewController() // 单例模式
  2. override func viewDidLoad() {
  3. super.viewDidLoad()
  4. var queue: DispatchQueue = DispatchQueue.main// 主线程
  5. if #available(iOS 8.0, *) {
  6. queue = DispatchQueue.global()
  7. } else {
  8. queue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.background)// 后台执行
  9. }
  10. // 异步执行队列任务
  11. queue.async {
  12. print("开新线程执行")
  13. }
  14. // 延时执行
  15. var delta:Int64 = Int64(2 * NSEC_PER_SEC)// 2s后执行,可能不仅限于2s
  16. delta = Int64(100 * NSEC_PER_MSEC)//100毫秒后执行
  17. // NSEC_PER_MSEC
  18. let when: DispatchTime = DispatchTime.now() + Double(delta) / Double(NSEC_PER_SEC)
  19. queue.asyncAfter(deadline: when) {
  20. print("dispatch_after")
  21. }
  22. // 分组执行
  23. let group = DispatchGroup()
  24. queue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default)// 默认优先级执行
  25. for i in 0 ..< 10 {
  26. //异步执行队列任务
  27. queue.async(group: group, execute: {
  28. print("queue.async(group: group \(i)")
  29. })
  30. }
  31. // 分组队列执行完毕后执行
  32. group.notify(queue: queue) {
  33. print("dispatch_group_notify")
  34. }
  35. // 串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。
  36. let serialQueue = DispatchQueue(label: "yangj", attributes: [])
  37. for i in 0 ..< 10 {
  38. //异步执行队列任务
  39. serialQueue.async {
  40. print("serialQueue.async \(i)")
  41. }
  42. }
  43. // 并发队列:有多个线程,操作进来之后它会将这些队列安排在可用的处理器上,同时保证先进来的任务优先处理。
  44. let globalQueue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default)
  45. for i in 0 ..< 10 {
  46. //异步执行队列任务
  47. globalQueue.async {
  48. print("globalQueue.async \(i)")
  49. }
  50. }
  51. }

}

KVO-

/// 用户
class User: NSObject {
/// 用户名
dynamic var userName:String?

  1. override init() {
  2. userName = ""
  3. }

}

/// KVO测试
class KVOTests: XCTestCase {

  1. /// 用户
  2. var user:User!;
  3. // MARK: 开始
  4. override func setUp() {
  5. super.setUp()
  6. self.user = User()
  7. self.user.addObserver(self, forKeyPath: "userName", options: NSKeyValueObservingOptions.new, context: nil)// 监听(KVO的属性必须设置dynamic)
  8. }
  9. // MARK: 结束
  10. override func tearDown() {
  11. super.tearDown()
  12. self.user.removeObserver(self, forKeyPath: "userName")
  13. self.user.userName = "YangJun"
  14. }
  15. // MARK: 测试用例
  16. func testExample() {
  17. self.user.userName = "阳君"
  18. }
  19. // MARK: - 监听
  20. override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
  21. if "userName" == keyPath {
  22. print("\nchange:\(change ?? [:])\n")
  23. }
  24. }

}

Parser-

/// json解析
class YJJSONParserTests: XCTestCase {

  1. var jsonString : String?
  2. override func setUp() {
  3. super.setUp()
  4. var dict = [String: String]()
  5. dict["name"] = "阳君"
  6. dict["qq"] = "937447974"
  7. do {
  8. if JSONSerialization.isValidJSONObject(dict) { // 能否转换为JSON Data
  9. // 转换为JSON Data
  10. let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions.prettyPrinted)
  11. // 转换为json串
  12. self.jsonString = String(data: data, encoding: String.Encoding.utf8)
  13. print("json生成:\(self.jsonString ?? "")")
  14. }
  15. } catch {
  16. print("转换出错:\(error)")
  17. }
  18. }
  19. override func tearDown() {
  20. super.tearDown()
  21. self.jsonString = nil
  22. }
  23. func testExample() {
  24. // json转data
  25. if let data = self.jsonString?.data(using: String.Encoding.utf8) {
  26. do {
  27. // data转JSON Object
  28. let jsonObject = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments)
  29. // JSON Object转实际对象
  30. if let dict = jsonObject as? Dictionary<String, AnyObject> {
  31. print("json解析:\(dict)")
  32. }
  33. } catch {
  34. print("解析xml出错:\(error)")
  35. }
  36. }
  37. }

}

/// xml解析
class YJXMLParserTests: XCTestCase, XMLParserDelegate {

  1. override func setUp() {
  2. super.setUp()
  3. // Put setup code here. This method is called before the invocation of each test method in the class.
  4. }
  5. override func tearDown() {
  6. // Put teardown code here. This method is called after the invocation of each test method in the class.
  7. super.tearDown()
  8. }
  9. func testExample() {
  10. if let url = Bundle.main.url(forResource: "Main", withExtension: "xml") {
  11. if let parser = XMLParser(contentsOf: url) {
  12. parser.shouldProcessNamespaces = false;
  13. parser.delegate = self;
  14. parser.parse()
  15. }
  16. }
  17. }
  18. // MARK: - NSXMLParserDelegate
  19. // MARK: 解析开始
  20. func parserDidStartDocument(_ parser: XMLParser) {
  21. print(#function)
  22. }
  23. // MARK: 解析结束
  24. func parserDidEndDocument(_ parser: XMLParser) {
  25. print(#function)
  26. }
  27. // MARK: 解析出错
  28. func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
  29. print("解析错误\(parseError.localizedDescription)")
  30. }
  31. // MARK: 解析器每次在XML中找到新的元素时,会调用该方法
  32. func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
  33. print("\(elementName) - \(namespaceURI ?? "") - \(qName ?? "") - \(attributeDict)")
  34. }

}