Skip to content

Commit cba8a6a

Browse files
author
Michael Long
committed
Fix autorelease bug in WeakLazyInjected property wrapper
1 parent 2882031 commit cba8a6a

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

Sources/Resolver/Resolver.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,7 @@ public struct Injected<Service> {
720720
///
721721
@propertyWrapper
722722
public struct LazyInjected<Service> {
723+
private var initialize: Bool = true
723724
private var service: Service!
724725
public var container: Resolver?
725726
public var name: String?
@@ -734,7 +735,8 @@ public struct LazyInjected<Service> {
734735
}
735736
public var wrappedValue: Service {
736737
mutating get {
737-
if self.service == nil {
738+
if initialize {
739+
self.initialize = false
738740
self.service = container?.resolve(Service.self, name: name, args: args) ?? Resolver.resolve(Service.self, name: name, args: args)
739741
}
740742
return service
@@ -756,6 +758,7 @@ public struct LazyInjected<Service> {
756758
///
757759
@propertyWrapper
758760
public struct WeakLazyInjected<Service:AnyObject> {
761+
private var initialize: Bool = true
759762
private weak var service: Service?
760763
public var container: Resolver?
761764
public var name: String?
@@ -770,8 +773,11 @@ public struct WeakLazyInjected<Service:AnyObject> {
770773
}
771774
public var wrappedValue: Service? {
772775
mutating get {
773-
if self.service == nil {
774-
self.service = container?.resolve(Service.self, name: name, args: args) ?? Resolver.resolve(Service.self, name: name, args: args)
776+
if initialize {
777+
self.initialize = false
778+
let service = container?.resolve(Service.self, name: name, args: args) ?? Resolver.resolve(Service.self, name: name, args: args)
779+
self.service = service
780+
return service
775781
}
776782
return service
777783
}
@@ -781,9 +787,6 @@ public struct WeakLazyInjected<Service:AnyObject> {
781787
get { return self }
782788
mutating set { self = newValue }
783789
}
784-
public mutating func release() {
785-
self.service = nil
786-
}
787790
}
788791

789792
@propertyWrapper

Tests/ResolverTests/ResolverInjectedTests.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,25 @@ class LazyInjectedArgumentsViewController {
4242
}
4343
}
4444

45+
class WeakLazyInjectedParentViewController {
46+
@Injected var strongService: WeakXYZService
47+
}
48+
49+
class WeakLazyInjectedChildViewController {
50+
@WeakLazyInjected var weakService: WeakXYZService?
51+
}
52+
4553
class OptionalInjectedViewController {
4654
@OptionalInjected var service: XYZService?
4755
@OptionalInjected var notRegistered: NotRegistered?
4856
}
4957

58+
class WeakXYZService: XYZService {
59+
func returnSomething() -> Bool {
60+
return true
61+
}
62+
}
63+
5064
class NotRegistered {
5165
}
5266

@@ -55,6 +69,8 @@ class ResolverInjectedTests: XCTestCase {
5569
override func setUp() {
5670
super.setUp()
5771

72+
Resolver.main.register { WeakXYZService(nil) }.scope(Resolver.shared)
73+
5874
Resolver.main.register { XYZSessionService() }
5975
Resolver.main.register { XYZService(Resolver.main.optional()) }
6076

@@ -112,10 +128,28 @@ class ResolverInjectedTests: XCTestCase {
112128
XCTAssert(vc.service.string == "betty")
113129
}
114130

131+
func testWParentChildWeakLazyInjectedViewController() {
132+
var parent: WeakLazyInjectedParentViewController? = WeakLazyInjectedParentViewController()
133+
XCTAssertNotNil(parent?.strongService)
134+
135+
let child = WeakLazyInjectedChildViewController()
136+
XCTAssert(child.$weakService.isEmpty == true)
137+
XCTAssert(child.weakService?.returnSomething() == true)
138+
XCTAssertNotNil(child.weakService)
139+
XCTAssert(child.$weakService.isEmpty == false)
140+
141+
parent = nil
142+
XCTAssert(child.$weakService.isEmpty == true)
143+
XCTAssertNil(parent?.strongService)
144+
XCTAssertNil(child.weakService)
145+
}
146+
115147
func testOptionalInjection() {
116148
let vc = OptionalInjectedViewController()
117149
XCTAssertNotNil(vc.service)
118150
XCTAssertNil(vc.notRegistered)
151+
vc.service = nil
152+
XCTAssertNil(vc.service)
119153
}
120154
}
121155

Tests/ResolverTests/XCTestManifests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ extension ResolverInjectedTests {
9595
("testNamedInjection1", testNamedInjection1),
9696
("testNamedInjection2", testNamedInjection2),
9797
("testOptionalInjection", testOptionalInjection),
98+
("testWParentChildWeakLazyInjectedViewController", testWParentChildWeakLazyInjectedViewController),
9899
]
99100
}
100101

0 commit comments

Comments
 (0)