From 7b06f5a1f5310df31b7340099dc102242a014246 Mon Sep 17 00:00:00 2001 From: ASPCartman Date: Thu, 25 Feb 2016 14:39:07 +0300 Subject: [PATCH 1/2] Fix reference counting I don't know how this could possibly work, but if you create a new application, add this lib and just try to BINDO with -observe: it won't work, because right after the creation of the binding it gets deallocated: `BNDBinding` is not retained. You had an `NSMutableSet`, where you add `BNDBinding`s, but now it's gone and only `BNDBindingKVOObserver` are retained by association. But they have a weak reference to parent `BNDBinding`. That's a fail. To fix this we must make `BNDBindingKVOObserver`s to hold strong reference to parent `BNDBinding`. --- BIND/Classes/BNDBinding.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BIND/Classes/BNDBinding.m b/BIND/Classes/BNDBinding.m index 8df798d..3feeb74 100644 --- a/BIND/Classes/BNDBinding.m +++ b/BIND/Classes/BNDBinding.m @@ -22,7 +22,7 @@ @interface BNDBindingKVOObserver : NSObject @property (nonatomic, copy, readonly) NSString *keyPath; -@property (nonatomic, weak, readonly) BNDBinding *binding; +@property (nonatomic, strong, readonly) BNDBinding *binding; + (instancetype)observerWithKeyPath:(NSString *)keyPath binding:(BNDBinding *)binding; @@ -41,8 +41,8 @@ @interface BNDBinding () @property (nonatomic, strong) NSValueTransformer *valueTransformer; @property (nonatomic) BOOL shouldSetInitialValues; -@property (nonatomic, strong) BNDBindingKVOObserver *leftObserver; -@property (nonatomic, strong) BNDBindingKVOObserver *rightObserver; +@property (nonatomic, weak) BNDBindingKVOObserver *leftObserver; +@property (nonatomic, weak) BNDBindingKVOObserver *rightObserver; @property (nonatomic) SEL transformSelector; @property (nonatomic) SEL reverseTransformSelector; From dfecad756694f11cac8171516f8d353a1efa2ffe Mon Sep 17 00:00:00 2001 From: ASPCartman Date: Thu, 25 Feb 2016 17:09:07 +0300 Subject: [PATCH 2/2] Fix observers leak Since BNDBinding.left/rightObserver are now weak, we can't just assign them. --- BIND/Classes/BNDBinding.m | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/BIND/Classes/BNDBinding.m b/BIND/Classes/BNDBinding.m index 3feeb74..feb91a1 100644 --- a/BIND/Classes/BNDBinding.m +++ b/BIND/Classes/BNDBinding.m @@ -273,15 +273,17 @@ - (void)setupObservers { [self removeObservers]; if (self.direction == BNDBindingDirectionLeftToRight || self.direction == BNDBindingDirectionBoth) { - self.leftObserver = [BNDBindingKVOObserver observerWithKeyPath:self.leftKeyPath - binding:self]; + BNDBindingKVOObserver *observer = [BNDBindingKVOObserver observerWithKeyPath:self.leftKeyPath + binding:self]; + self.leftObserver = observer; [self.leftObserver observe:self.leftObject]; } if (self.direction == BNDBindingDirectionRightToLeft || self.direction == BNDBindingDirectionBoth) { - self.rightObserver = [BNDBindingKVOObserver observerWithKeyPath:self.rightKeyPath - binding:self]; + BNDBindingKVOObserver *observer = [BNDBindingKVOObserver observerWithKeyPath:self.rightKeyPath + binding:self]; + self.rightObserver = observer; [self.rightObserver observe:self.rightObject]; } }