From fca43a651f57f51dd0499ba03a75b1ffc9a6195a Mon Sep 17 00:00:00 2001 From: rcancro <@pinterest.com> Date: Fri, 28 Aug 2015 20:41:40 -0700 Subject: [PATCH] Make layoutOptions readonly --- AsyncDisplayKit/Layout/ASLayoutOptions.h | 9 +++- AsyncDisplayKit/Layout/ASLayoutOptions.m | 44 +++++++++++-------- .../Layout/ASLayoutOptionsPrivate.mm | 7 +-- AsyncDisplayKit/Layout/ASLayoutSpec.mm | 5 +-- AsyncDisplayKit/Layout/ASLayoutablePrivate.h | 2 +- 5 files changed, 38 insertions(+), 29 deletions(-) diff --git a/AsyncDisplayKit/Layout/ASLayoutOptions.h b/AsyncDisplayKit/Layout/ASLayoutOptions.h index 3df0f7c673..937f6c7640 100644 --- a/AsyncDisplayKit/Layout/ASLayoutOptions.h +++ b/AsyncDisplayKit/Layout/ASLayoutOptions.h @@ -24,6 +24,14 @@ - (instancetype)initWithLayoutable:(id)layoutable; - (void)setValuesFromLayoutable:(id)layoutable; +#pragma mark - Subclasses should implement these! ++ (NSSet *)keyPathsForValuesAffectingChangeMonitor; +- (void)setupDefaults; +- (instancetype)copyWithZone:(NSZone *)zone; +- (void)copyIntoOptions:(ASLayoutOptions *)layoutOptions; + +#pragma mark - Mutability checks + @property (nonatomic, assign) BOOL isMutable; #if DEBUG @@ -49,6 +57,5 @@ @property (nonatomic, readwrite) ASRelativeSizeRange sizeRange; @property (nonatomic, readwrite) CGPoint layoutPosition; -- (void)setupDefaults; @end diff --git a/AsyncDisplayKit/Layout/ASLayoutOptions.m b/AsyncDisplayKit/Layout/ASLayoutOptions.m index e0ebf622f5..9d8d9c6a0e 100644 --- a/AsyncDisplayKit/Layout/ASLayoutOptions.m +++ b/AsyncDisplayKit/Layout/ASLayoutOptions.m @@ -13,7 +13,6 @@ #import #import #import "ASInternalHelpers.h" -#import @implementation ASLayoutOptions @@ -35,6 +34,10 @@ static Class gDefaultLayoutOptionsClass = nil; return gDefaultLayoutOptionsClass; } +- (instancetype)init +{ + return [self initWithLayoutable:nil]; +} - (instancetype)initWithLayoutable:(id)layoutable; { @@ -42,30 +45,31 @@ static Class gDefaultLayoutOptionsClass = nil; if (self) { [self setupDefaults]; [self setValuesFromLayoutable:layoutable]; + _isMutable = YES; #if DEBUG - [self addObserver:self forKeyPath:@"changeMonitor" - options:NSKeyValueObservingOptionNew - context:nil]; + [self addObserver:self + forKeyPath:@"changeMonitor" + options:NSKeyValueObservingOptionNew + context:nil]; #endif } return self; } +- (void)dealloc +{ +#if DEBUG + [self removeObserver:self forKeyPath:@"changeMonitor"]; +#endif +} + #if DEBUG + (NSSet *)keyPathsForValuesAffectingChangeMonitor { NSMutableSet *keys = [NSMutableSet set]; - unsigned int count; - - objc_property_t *properties = class_copyPropertyList([self class], &count); - for (size_t i = 0; i < count; ++i) { - NSString *property = [NSString stringWithCString:property_getName(properties[i]) encoding:NSASCIIStringEncoding]; - - if ([property isEqualToString: @"observableSelf"] == NO) { - [keys addObject: property]; - } - } - free(properties); + [keys addObjectsFromArray:@[@"spacingBefore", @"spacingAfter", @"flexGrow", @"flexShrink", @"flexBasis", @"alignSelf"]]; + [keys addObjectsFromArray:@[@"ascender", @"descender"]]; + [keys addObjectsFromArray:@[@"sizeRange", @"layoutPosition"]]; return keys; } @@ -89,7 +93,12 @@ static Class gDefaultLayoutOptionsClass = nil; - (id)copyWithZone:(NSZone *)zone { ASLayoutOptions *copy = [[[self class] alloc] init]; + [self copyIntoOptions:copy]; + return copy; +} +- (void)copyIntoOptions:(ASLayoutOptions *)copy +{ copy.flexBasis = self.flexBasis; copy.spacingAfter = self.spacingAfter; copy.spacingBefore = self.spacingBefore; @@ -98,13 +107,12 @@ static Class gDefaultLayoutOptionsClass = nil; copy.ascender = self.ascender; copy.descender = self.descender; - + copy.sizeRange = self.sizeRange; copy.layoutPosition = self.layoutPosition; - - return copy; } + #pragma mark - Defaults - (void)setupDefaults { diff --git a/AsyncDisplayKit/Layout/ASLayoutOptionsPrivate.mm b/AsyncDisplayKit/Layout/ASLayoutOptionsPrivate.mm index f04c010936..39d129ba11 100644 --- a/AsyncDisplayKit/Layout/ASLayoutOptionsPrivate.mm +++ b/AsyncDisplayKit/Layout/ASLayoutOptionsPrivate.mm @@ -17,17 +17,12 @@ {\ dispatch_once(&_layoutOptionsInitializeToken, ^{\ if (_layoutOptions == nil) {\ -_layoutOptions = [[[ASLayoutOptions defaultLayoutOptionsClass] alloc] init];\ +_layoutOptions = [[[ASLayoutOptions defaultLayoutOptionsClass] alloc] initWithLayoutable:self];\ }\ });\ return _layoutOptions;\ }\ \ -- (void)setLayoutOptions:(ASLayoutOptions *)layoutOptions\ -{\ - _layoutOptions = layoutOptions;\ -}\ -\ - (CGFloat)spacingBefore\ {\ return self.layoutOptions.spacingBefore;\ diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index 904c30cc69..6c506b655c 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -66,9 +66,8 @@ static NSString * const kDefaultChildrenKey = @"kDefaultChildrenKey"; id finalLayoutable = [child finalLayoutableWithParent:self]; if (finalLayoutable) { - ASLayoutOptions *finalLayoutOptions = [layoutOptions copy]; - finalLayoutOptions.isMutable = NO; - finalLayoutable.layoutOptions = finalLayoutOptions; + [layoutOptions copyIntoOptions:finalLayoutable.layoutOptions]; + finalLayoutable.layoutOptions.isMutable = NO; return finalLayoutable; } return child; diff --git a/AsyncDisplayKit/Layout/ASLayoutablePrivate.h b/AsyncDisplayKit/Layout/ASLayoutablePrivate.h index c7ab3b7ad3..2d317fc7ca 100644 --- a/AsyncDisplayKit/Layout/ASLayoutablePrivate.h +++ b/AsyncDisplayKit/Layout/ASLayoutablePrivate.h @@ -15,5 +15,5 @@ @protocol ASLayoutablePrivate - (ASLayoutSpec *)finalLayoutableWithParent:(ASLayoutSpec *)parentSpec; -@property (nonatomic, strong) ASLayoutOptions *layoutOptions; +@property (nonatomic, strong, readonly) ASLayoutOptions *layoutOptions; @end