squarezw
7/5/2016 - 2:42 AM

Tips

Tips

// 如何增加一个方法必须实现的提示
class Ordered {
    func precedes(other: Ordered) -> Bool { fatalError("implement me!") }
}

// 如何动态加载一个 Class
let aClass: AnyClass? = NSClassFromString("mihaibao.RootTabBarController")
if (aClass != nil) {
  let clsName = NSStringFromClass(aClass!)
  print(clsName)
} else {
  print("error ViewController not found")
}

// 如何打印更多的信息 
po response as! HTTPURLResponse
// 解决循环引用 

/********** i.e Case 1 ***********/
class A {
    let b: B
    init() {
        b = B()
        b.a = self
    }

    deinit {
        print("A deinit")
    }
}

class B {
    var a: A? = nil
    deinit {
        print("B deinit")
    }
}

// 解决
class B {
    weak var a: A? = nil
    deinit {
        print("B deinit")
    }
}

/********** delegate 常用场景解决循环引用 **********/

// RequestManager.swift
class RequestManager: RequestHandler {

    @objc func requestFinished() {
        print("请求完成")
    }

    func sendRequest() {
        let req = Request()
        req.delegate = self

        req.send()
    }
}

// Request.swift
@objc protocol RequestHandler {
    optional func requestFinished()
}

class Request {
    weak var delegate: RequestHandler!;

    func send() {
        // 发送请求
        // 一般来说会将 req 的引用传递给网络框架
    }

    func gotResponse() {
        // 请求返回
        delegate?.requestFinished?()
    }
}

/********** 闭包避免循环引用 **********/

class Person {
    let name: String
    lazy var printName: ()->() = {
        print("The name is \(self.name)")
    }

    init(personName: String) {
        name = personName
    }

    deinit {
        print("Person deinit \(self.name)")
    }
}

var xiaoMing: Person? = Person(personName: "XiaoMing")
xiaoMing!.printName()
xiaoMing = nil
// 输出:
// The name is XiaoMing,没有被释放

// 解决
lazy var printName: ()->() = {
    [weak self] in
    if let strongSelf = self {
        print("The name is \(strongSelf.name)")
    }
}