Skip to content

Instantly share code, notes, and snippets.

@SunXiaoShan
Last active December 4, 2017 06:05
Show Gist options
  • Save SunXiaoShan/f6523a5ac900fcaacd1793b6006fac20 to your computer and use it in GitHub Desktop.
Save SunXiaoShan/f6523a5ac900fcaacd1793b6006fac20 to your computer and use it in GitHub Desktop.
DemoSwiftLeak
import XCTest
@testable import DemoWeak
class DemoWeakTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testDelegateMemoryLeak() {
let controller = ViewController()
var observer = ObserverMock()
weak var weakObserver = observer
controller.addObserver(weakObserver!)
observer = UIPageViewControllerDelegateMock()
XCTAssertNil(weakObserver)
}
func ObserverMock() -> ManagerObserver {
return ManagerObserver()
}
}
class UserManager {
private var observers = [ObserverWrapper]()
public func addObserver(_ observer: ManagerObserver) {
let wrapper = ObserverWrapper(observer: observer)
observers.append(wrapper)
}
}
private extension UserManager {
struct ObserverWrapper {
weak var observer: ManagerObserver?
}
}
// define ManagerObserver
class ManagerObserver: NSObject, UIPageViewControllerDelegate {
}
protocol UIPageViewControllerDelegate {
}
class ViewController: UIViewController {
private var observers = UserManager()
func addObserver(_ observer: ManagerObserver) {
observers.addObserver(observer)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment