mirror of
https://github.com/HackPlan/AsyncDisplayKit.git
synced 2026-03-29 16:48:59 +08:00
Convert AsyncDisplayKit to ARC.
This commit is contained in:
@@ -7,28 +7,27 @@ Pod::Spec.new do |spec|
|
||||
spec.summary = 'Smooth asynchronous user interfaces for iOS apps.'
|
||||
spec.source = { :git => 'https://github.com/facebook/AsyncDisplayKit.git', :tag => '1.0beta' }
|
||||
|
||||
# these files mustn't be compiled with ARC enabled
|
||||
mrr_source_files = [
|
||||
'AsyncDisplayKit/ASDisplayNode.mm',
|
||||
'AsyncDisplayKit/ASControlNode.m',
|
||||
'AsyncDisplayKit/ASImageNode.mm',
|
||||
'AsyncDisplayKit/Details/_ASDisplayView.mm',
|
||||
'AsyncDisplayKit/Private/_ASPendingState.m',
|
||||
]
|
||||
|
||||
spec.public_header_files = [
|
||||
'AsyncDisplayKit/*.h',
|
||||
'AsyncDisplayKit/Details/**/*.h',
|
||||
'Base/*.h'
|
||||
]
|
||||
|
||||
spec.source_files = ['AsyncDisplayKit/**/*.{h,m,mm}', 'Base/*.{h,m}']
|
||||
spec.exclude_files = mrr_source_files
|
||||
spec.source_files = [
|
||||
'AsyncDisplayKit/**/*.{h,m,mm}',
|
||||
'Base/*.{h,m}'
|
||||
]
|
||||
|
||||
# ASDealloc2MainObject must be compiled with MRR
|
||||
spec.requires_arc = true
|
||||
spec.subspec 'no-arc' do |mrr|
|
||||
spec.exclude_files = ['AsyncDisplayKit/Details/ASDealloc2MainObject.m']
|
||||
spec.subspec 'ASDealloc2MainObject' do |mrr|
|
||||
mrr.requires_arc = false
|
||||
mrr.source_files = mrr_source_files
|
||||
mrr.source_files = [
|
||||
'AsyncDisplayKit/Private/_AS-objc-internal.h',
|
||||
'AsyncDisplayKit/Details/ASDealloc2MainObject.h',
|
||||
'AsyncDisplayKit/Details/ASDealloc2MainObject.m',
|
||||
]
|
||||
end
|
||||
|
||||
spec.social_media_url = 'https://twitter.com/fbOpenSource'
|
||||
|
||||
@@ -20,13 +20,13 @@
|
||||
058D09C1195D04C000B7D73C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 058D09C0195D04C000B7D73C /* UIKit.framework */; };
|
||||
058D09C4195D04C000B7D73C /* libAsyncDisplayKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 058D09AC195D04C000B7D73C /* libAsyncDisplayKit.a */; };
|
||||
058D09CA195D04C000B7D73C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 058D09C8195D04C000B7D73C /* InfoPlist.strings */; };
|
||||
058D0A13195D050800B7D73C /* ASControlNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 058D09D6195D050800B7D73C /* ASControlNode.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
|
||||
058D0A14195D050800B7D73C /* ASDisplayNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D09D9195D050800B7D73C /* ASDisplayNode.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
|
||||
058D0A13195D050800B7D73C /* ASControlNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 058D09D6195D050800B7D73C /* ASControlNode.m */; };
|
||||
058D0A14195D050800B7D73C /* ASDisplayNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D09D9195D050800B7D73C /* ASDisplayNode.mm */; };
|
||||
058D0A15195D050800B7D73C /* ASDisplayNodeExtras.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D09DC195D050800B7D73C /* ASDisplayNodeExtras.mm */; };
|
||||
058D0A16195D050800B7D73C /* ASImageNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D09DE195D050800B7D73C /* ASImageNode.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
|
||||
058D0A16195D050800B7D73C /* ASImageNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D09DE195D050800B7D73C /* ASImageNode.mm */; };
|
||||
058D0A17195D050800B7D73C /* ASTextNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D09E0195D050800B7D73C /* ASTextNode.mm */; };
|
||||
058D0A18195D050800B7D73C /* _ASDisplayLayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D09E3195D050800B7D73C /* _ASDisplayLayer.mm */; };
|
||||
058D0A19195D050800B7D73C /* _ASDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D09E5195D050800B7D73C /* _ASDisplayView.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
|
||||
058D0A19195D050800B7D73C /* _ASDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D09E5195D050800B7D73C /* _ASDisplayView.mm */; };
|
||||
058D0A1A195D050800B7D73C /* ASHighlightOverlayLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 058D09E7195D050800B7D73C /* ASHighlightOverlayLayer.m */; };
|
||||
058D0A1B195D050800B7D73C /* ASMutableAttributedStringBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 058D09E9195D050800B7D73C /* ASMutableAttributedStringBuilder.m */; };
|
||||
058D0A1C195D050800B7D73C /* ASTextNodeCoreTextAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 058D09EB195D050800B7D73C /* ASTextNodeCoreTextAdditions.m */; };
|
||||
@@ -40,7 +40,7 @@
|
||||
058D0A24195D050800B7D73C /* _ASAsyncTransactionGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 058D09FE195D050800B7D73C /* _ASAsyncTransactionGroup.m */; };
|
||||
058D0A25195D050800B7D73C /* UIView+ASConvenience.m in Sources */ = {isa = PBXBuildFile; fileRef = 058D0A00195D050800B7D73C /* UIView+ASConvenience.m */; };
|
||||
058D0A26195D050800B7D73C /* _ASCoreAnimationExtras.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D0A04195D050800B7D73C /* _ASCoreAnimationExtras.mm */; };
|
||||
058D0A27195D050800B7D73C /* _ASPendingState.m in Sources */ = {isa = PBXBuildFile; fileRef = 058D0A06195D050800B7D73C /* _ASPendingState.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
|
||||
058D0A27195D050800B7D73C /* _ASPendingState.m in Sources */ = {isa = PBXBuildFile; fileRef = 058D0A06195D050800B7D73C /* _ASPendingState.m */; };
|
||||
058D0A28195D050800B7D73C /* ASDisplayNode+AsyncDisplay.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D0A08195D050800B7D73C /* ASDisplayNode+AsyncDisplay.mm */; };
|
||||
058D0A29195D050800B7D73C /* ASDisplayNode+DebugTiming.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D0A0A195D050800B7D73C /* ASDisplayNode+DebugTiming.mm */; };
|
||||
058D0A2A195D050800B7D73C /* ASDisplayNode+UIViewBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = 058D0A0B195D050800B7D73C /* ASDisplayNode+UIViewBridge.mm */; };
|
||||
@@ -118,6 +118,8 @@
|
||||
058D0A82195D060300B7D73C /* ASAssert.h in Headers */ = {isa = PBXBuildFile; fileRef = 058D0A43195D058D00B7D73C /* ASAssert.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
058D0A83195D060300B7D73C /* ASBaseDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 058D0A44195D058D00B7D73C /* ASBaseDefines.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
058D0A84195D060300B7D73C /* ASDisplayNodeExtraIvars.h in Headers */ = {isa = PBXBuildFile; fileRef = 058D0A45195D058D00B7D73C /* ASDisplayNodeExtraIvars.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
05A6D05A19D0EB64002DD95E /* ASDealloc2MainObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 05A6D05819D0EB64002DD95E /* ASDealloc2MainObject.h */; };
|
||||
05A6D05B19D0EB64002DD95E /* ASDealloc2MainObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 05A6D05919D0EB64002DD95E /* ASDealloc2MainObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
|
||||
6BDC61F61979037800E50D21 /* AsyncDisplayKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BDC61F51978FEA400E50D21 /* AsyncDisplayKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
DB7121BCD50849C498C886FB /* libPods-AsyncDisplayKitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EFA731F0396842FF8AB635EE /* libPods-AsyncDisplayKitTests.a */; };
|
||||
/* End PBXBuildFile section */
|
||||
@@ -234,6 +236,8 @@
|
||||
058D0A43195D058D00B7D73C /* ASAssert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASAssert.h; sourceTree = "<group>"; };
|
||||
058D0A44195D058D00B7D73C /* ASBaseDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASBaseDefines.h; sourceTree = "<group>"; };
|
||||
058D0A45195D058D00B7D73C /* ASDisplayNodeExtraIvars.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASDisplayNodeExtraIvars.h; sourceTree = "<group>"; };
|
||||
05A6D05819D0EB64002DD95E /* ASDealloc2MainObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASDealloc2MainObject.h; path = ../Details/ASDealloc2MainObject.h; sourceTree = "<group>"; };
|
||||
05A6D05919D0EB64002DD95E /* ASDealloc2MainObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ASDealloc2MainObject.m; path = ../Details/ASDealloc2MainObject.m; sourceTree = "<group>"; };
|
||||
6BDC61F51978FEA400E50D21 /* AsyncDisplayKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AsyncDisplayKit.h; sourceTree = "<group>"; };
|
||||
EFA731F0396842FF8AB635EE /* libPods-AsyncDisplayKitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AsyncDisplayKitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
FAD7085290B84183BD13BA1A /* Pods-AsyncDisplayKitTests.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AsyncDisplayKitTests.xcconfig"; path = "Pods/Pods-AsyncDisplayKitTests.xcconfig"; sourceTree = "<group>"; };
|
||||
@@ -389,6 +393,8 @@
|
||||
058D09F7195D050800B7D73C /* Transactions */,
|
||||
058D09FF195D050800B7D73C /* UIView+ASConvenience.h */,
|
||||
058D0A00195D050800B7D73C /* UIView+ASConvenience.m */,
|
||||
05A6D05819D0EB64002DD95E /* ASDealloc2MainObject.h */,
|
||||
05A6D05919D0EB64002DD95E /* ASDealloc2MainObject.m */,
|
||||
);
|
||||
path = Details;
|
||||
sourceTree = "<group>";
|
||||
@@ -458,6 +464,7 @@
|
||||
058D0A4E195D05CB00B7D73C /* ASDisplayNodeExtras.mm in Headers */,
|
||||
058D0A4F195D05CB00B7D73C /* ASImageNode.h in Headers */,
|
||||
058D0A50195D05CB00B7D73C /* ASImageNode.mm in Headers */,
|
||||
05A6D05A19D0EB64002DD95E /* ASDealloc2MainObject.h in Headers */,
|
||||
058D0A51195D05CB00B7D73C /* ASTextNode.h in Headers */,
|
||||
058D0A52195D05CB00B7D73C /* ASTextNode.mm in Headers */,
|
||||
055F1A3819ABD413004DAFF1 /* ASRangeController.h in Headers */,
|
||||
@@ -658,6 +665,7 @@
|
||||
058D0A1C195D050800B7D73C /* ASTextNodeCoreTextAdditions.m in Sources */,
|
||||
058D0A13195D050800B7D73C /* ASControlNode.m in Sources */,
|
||||
058D0A19195D050800B7D73C /* _ASDisplayView.mm in Sources */,
|
||||
05A6D05B19D0EB64002DD95E /* ASDealloc2MainObject.m in Sources */,
|
||||
058D0A17195D050800B7D73C /* ASTextNode.mm in Sources */,
|
||||
058D0A27195D050800B7D73C /* _ASPendingState.m in Sources */,
|
||||
058D0A16195D050800B7D73C /* ASImageNode.mm in Sources */,
|
||||
|
||||
@@ -104,12 +104,6 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_controlEventDispatchTable release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
#pragma mark - ASDisplayNode Overrides
|
||||
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
@@ -251,7 +245,6 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v
|
||||
// Create the dispatch table for this event.
|
||||
eventDispatchTable = [[NSMutableDictionary alloc] initWithCapacity:kASControlNodeTargetDispatchTableInitialCapacity]; // enough to handle common types without re-hashing the dictionary when adding entries
|
||||
[_controlEventDispatchTable setObject:eventDispatchTable forKey:eventKey];
|
||||
[eventDispatchTable release];
|
||||
}
|
||||
|
||||
// Have we seen this target before for this event?
|
||||
@@ -262,7 +255,6 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v
|
||||
// Nope. Create an actions array for it.
|
||||
targetActions = [[NSMutableArray alloc] initWithCapacity:kASControlNodeActionDispatchTableInitialCapacity]; // enough to handle common types without re-hashing the dictionary when adding entries.
|
||||
[eventDispatchTable setObject:targetActions forKey:targetKey];
|
||||
[targetActions release];
|
||||
}
|
||||
|
||||
// Add the action message.
|
||||
@@ -299,7 +291,7 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v
|
||||
[targets addObject:_ASControlNodeTargetForTargetKey(targetKey)];
|
||||
}
|
||||
|
||||
return [targets autorelease];
|
||||
return targets;
|
||||
}
|
||||
|
||||
- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(ASControlNodeEvent)controlEventMask
|
||||
@@ -397,7 +389,7 @@ id<NSCopying> _ASControlNodeEventKeyForControlEvent(ASControlNodeEvent controlEv
|
||||
|
||||
id<NSCopying> _ASControlNodeTargetKeyForTarget(id target)
|
||||
{
|
||||
return (target ? [NSValue valueWithPointer:target] : [NSNull null]);
|
||||
return (target ? [NSValue valueWithPointer:(__bridge const void *)(target)] : [NSNull null]);
|
||||
}
|
||||
|
||||
id _ASControlNodeTargetForTargetKey(id<NSCopying> targetKey)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
#import "_ASAsyncTransactionContainer.h"
|
||||
#import "ASBaseDefines.h"
|
||||
#import "ASDealloc2MainObject.h"
|
||||
|
||||
|
||||
/**
|
||||
@@ -28,7 +29,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
@interface ASDisplayNode : NSObject
|
||||
@interface ASDisplayNode : ASDealloc2MainObject
|
||||
|
||||
|
||||
/** @name Initializing a node object */
|
||||
|
||||
@@ -81,7 +81,7 @@ BOOL ASDisplayNodeSubclassOverridesSelector(Class subclass, SEL selector)
|
||||
return nil;
|
||||
|
||||
ASDisplayNodeAssert([viewClass isSubclassOfClass:[UIView class]], @"should initialize with a subclass of UIView");
|
||||
_viewClass = [viewClass retain];
|
||||
_viewClass = viewClass;
|
||||
_flags.isSynchronous = ![viewClass isSubclassOfClass:[_ASDisplayView class]];
|
||||
|
||||
return self;
|
||||
@@ -94,7 +94,7 @@ BOOL ASDisplayNodeSubclassOverridesSelector(Class subclass, SEL selector)
|
||||
|
||||
ASDisplayNodeAssert([layerClass isSubclassOfClass:[CALayer class]], @"should initialize with a subclass of CALayer");
|
||||
|
||||
_layerClass = [layerClass retain];
|
||||
_layerClass = layerClass;
|
||||
_flags.isSynchronous = ![layerClass isSubclassOfClass:[_ASDisplayLayer class]];
|
||||
|
||||
_flags.isLayerBacked = YES;
|
||||
@@ -123,14 +123,6 @@ BOOL ASDisplayNodeSubclassOverridesSelector(Class subclass, SEL selector)
|
||||
return self;
|
||||
}
|
||||
|
||||
#if __has_feature(objc_arc)
|
||||
#warning This file must be compiled without ARC. Use -fno-objc-arc (or convert project to MRR).
|
||||
#endif
|
||||
|
||||
#if !__has_feature(objc_arc)
|
||||
_OBJC_SUPPORTED_INLINE_REFCNT_WITH_DEALLOC2MAIN(_retainCount);
|
||||
#endif
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
ASDisplayNodeAssertMainThread();
|
||||
@@ -147,28 +139,18 @@ _OBJC_SUPPORTED_INLINE_REFCNT_WITH_DEALLOC2MAIN(_retainCount);
|
||||
for (ASDisplayNode *subnode in _subnodes)
|
||||
[subnode __setSupernode:nil];
|
||||
|
||||
[_viewClass release];
|
||||
[_subnodes release];
|
||||
|
||||
[_view release];
|
||||
_view = nil;
|
||||
_subnodes = nil;
|
||||
if (_flags.isLayerBacked) {
|
||||
_layer.delegate = nil;
|
||||
}
|
||||
[_layer release];
|
||||
_layer = nil;
|
||||
|
||||
[self __setSupernode:nil];
|
||||
[_pendingViewState release];
|
||||
_pendingViewState = nil;
|
||||
[_replaceAsyncSentinel release];
|
||||
_replaceAsyncSentinel = nil;
|
||||
|
||||
[_displaySentinel release];
|
||||
_displaySentinel = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
#pragma mark - UIResponder overrides
|
||||
@@ -230,7 +212,7 @@ _OBJC_SUPPORTED_INLINE_REFCNT_WITH_DEALLOC2MAIN(_retainCount);
|
||||
}
|
||||
_view = [[_viewClass alloc] init];
|
||||
_view.asyncdisplaykit_node = self;
|
||||
_layer = [_view.layer retain];
|
||||
_layer = _view.layer;
|
||||
}
|
||||
_layer.asyncdisplaykit_node = self;
|
||||
#if DEBUG
|
||||
@@ -671,8 +653,6 @@ static bool disableNotificationsForMovingBetweenParents(ASDisplayNode *from, ASD
|
||||
if (subnodeIndex == NSNotFound)
|
||||
return;
|
||||
|
||||
[subnode retain];
|
||||
|
||||
ASDisplayNode *oldParent = [subnode _deallocSafeSupernode];
|
||||
// Disable appearance methods during move between supernodes, but make sure we restore their state after we do our thing
|
||||
BOOL isMovingEquivalentParents = disableNotificationsForMovingBetweenParents(oldParent, self);
|
||||
@@ -715,7 +695,6 @@ static bool disableNotificationsForMovingBetweenParents(ASDisplayNode *from, ASD
|
||||
}
|
||||
|
||||
[subnode __setSupernode:self];
|
||||
[subnode release];
|
||||
}
|
||||
|
||||
- (void)replaceSubnode:(ASDisplayNode *)oldSubnode withSubnode:(ASDisplayNode *)replacementSubnode
|
||||
@@ -882,7 +861,7 @@ static NSInteger incrementIfFound(NSInteger i) {
|
||||
{
|
||||
ASDisplayNodeAssertMainThread();
|
||||
|
||||
for (ASDisplayNode *node in [[_subnodes copy] autorelease]) {
|
||||
for (ASDisplayNode *node in [_subnodes copy]) {
|
||||
[self _addSubnodeSubviewOrSublayer:node];
|
||||
}
|
||||
}
|
||||
@@ -1040,14 +1019,14 @@ static NSInteger incrementIfFound(NSInteger i) {
|
||||
{
|
||||
ASDisplayNodeAssertThreadAffinity(self);
|
||||
ASDN::MutexLocker l(_propertyLock);
|
||||
return [[_subnodes copy] autorelease];
|
||||
return [_subnodes copy];
|
||||
}
|
||||
|
||||
- (ASDisplayNode *)supernode
|
||||
{
|
||||
ASDisplayNodeAssertThreadAffinity(self);
|
||||
ASDN::MutexLocker l(_propertyLock);
|
||||
return [[_supernode retain] autorelease];
|
||||
return _supernode;
|
||||
}
|
||||
|
||||
// This is a thread-method to return the supernode without causing it to be retained autoreleased. See -_removeSubnode: for details.
|
||||
@@ -1255,7 +1234,6 @@ static NSInteger incrementIfFound(NSInteger i) {
|
||||
[_pendingViewState applyToView:_view];
|
||||
}
|
||||
|
||||
[_pendingViewState release];
|
||||
_pendingViewState = nil;
|
||||
|
||||
// TODO: move this into real pending state
|
||||
@@ -1393,7 +1371,7 @@ static void _recursiveSetPreventOrCancelDisplay(ASDisplayNode *node, CALayer *la
|
||||
if (!_replaceAsyncSentinel) {
|
||||
_replaceAsyncSentinel = [[ASSentinel alloc] init];
|
||||
}
|
||||
return [[_replaceAsyncSentinel retain] autorelease];
|
||||
return _replaceAsyncSentinel;
|
||||
}
|
||||
|
||||
// Calls completion with nil to indicated cancellation
|
||||
@@ -1505,7 +1483,7 @@ static void _recursiveSetPreventOrCancelDisplay(ASDisplayNode *node, CALayer *la
|
||||
}
|
||||
}];
|
||||
|
||||
return [placeholder autorelease];
|
||||
return placeholder;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1560,7 +1538,7 @@ static void _recursiveSetPreventOrCancelDisplay(ASDisplayNode *node, CALayer *la
|
||||
|
||||
- (NSString *)_recursiveDescriptionHelperWithIndent:(NSString *)indent
|
||||
{
|
||||
NSMutableString *subtree = [[[[indent stringByAppendingString: self.descriptionForRecursiveDescription] stringByAppendingString:@"\n"] mutableCopy] autorelease];
|
||||
NSMutableString *subtree = [[[indent stringByAppendingString: self.descriptionForRecursiveDescription] stringByAppendingString:@"\n"] mutableCopy];
|
||||
for (ASDisplayNode *n in self.subnodes) {
|
||||
[subtree appendString:[n _recursiveDescriptionHelperWithIndent:[indent stringByAppendingString:@" | "]]];
|
||||
}
|
||||
|
||||
@@ -40,10 +40,10 @@
|
||||
|
||||
_cropEnabled = cropEnabled;
|
||||
_opaque = opaque;
|
||||
_image = [image retain];
|
||||
_image = image;
|
||||
_bounds = bounds;
|
||||
_contentsScale = contentsScale;
|
||||
_backgroundColor = [backgroundColor retain];
|
||||
_backgroundColor = backgroundColor;
|
||||
_tint = tint;
|
||||
_contentMode = contentMode;
|
||||
_cropRect = cropRect;
|
||||
@@ -52,14 +52,6 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_image release];
|
||||
[_backgroundColor release];
|
||||
[_imageModificationBlock release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
return [NSString stringWithFormat:@"<%@ : %p image:%@ cropEnabled:%@ opaque:%@ bounds:%@ contentsScale:%.2f backgroundColor:%@ tint:%zd contentMode:%@ cropRect:%@>", [self class], self, self.image, @(self.cropEnabled), @(self.opaque), NSStringFromCGRect(self.bounds), self.contentsScale, self.backgroundColor, self.tint, ASDisplayNodeNSStringFromUIContentMode(self.contentMode), NSStringFromCGRect(self.cropRect)];
|
||||
@@ -102,14 +94,6 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_displayCompletionBlock release];
|
||||
[_image release];
|
||||
[_imageModificationBlock release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (CGSize)calculateSizeThatFits:(CGSize)constrainedSize
|
||||
{
|
||||
ASDN::MutexLocker l(_imageLock);
|
||||
@@ -124,8 +108,7 @@
|
||||
ASDisplayNodeAssertThreadAffinity(self);
|
||||
ASDN::MutexLocker l(_imageLock);
|
||||
if (_image != image) {
|
||||
[_image release];
|
||||
_image = [image retain];
|
||||
_image = image;
|
||||
[self invalidateCalculatedSize];
|
||||
[self setNeedsDisplay];
|
||||
}
|
||||
@@ -135,7 +118,7 @@
|
||||
{
|
||||
ASDisplayNodeAssertThreadAffinity(self);
|
||||
ASDN::MutexLocker l(_imageLock);
|
||||
return [[_image retain] autorelease];
|
||||
return _image;
|
||||
}
|
||||
|
||||
- (void)setTint:(ASImageNodeTint)tint
|
||||
@@ -159,17 +142,16 @@
|
||||
{
|
||||
BOOL hasValidCropBounds = _cropEnabled && !CGRectIsNull(_cropDisplayBounds) && !CGRectIsEmpty(_cropDisplayBounds);
|
||||
|
||||
return [[[_ASImageNodeDrawParameters alloc] initWithCrop:_cropEnabled
|
||||
opaque:self.opaque
|
||||
image:self.image
|
||||
bounds:(hasValidCropBounds ? _cropDisplayBounds : self.bounds)
|
||||
contentsScale:self.contentsScaleForDisplay
|
||||
backgroundColor:self.backgroundColor
|
||||
tint:self.tint
|
||||
contentMode:self.contentMode
|
||||
cropRect:self.cropRect
|
||||
imageModificationBlock:self.imageModificationBlock
|
||||
] autorelease];
|
||||
return [[_ASImageNodeDrawParameters alloc] initWithCrop:_cropEnabled
|
||||
opaque:self.opaque
|
||||
image:self.image
|
||||
bounds:(hasValidCropBounds ? _cropDisplayBounds : self.bounds)
|
||||
contentsScale:self.contentsScaleForDisplay
|
||||
backgroundColor:self.backgroundColor
|
||||
tint:self.tint
|
||||
contentMode:self.contentMode
|
||||
cropRect:self.cropRect
|
||||
imageModificationBlock:self.imageModificationBlock];
|
||||
}
|
||||
|
||||
+ (UIImage *)displayWithParameters:(_ASImageNodeDrawParameters *)parameters isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled
|
||||
@@ -287,7 +269,6 @@
|
||||
|
||||
// FIXME: _displayCompletionBlock is not protected by lock
|
||||
_displayCompletionBlock(NO);
|
||||
[_displayCompletionBlock release];
|
||||
_displayCompletionBlock = nil;
|
||||
}
|
||||
}
|
||||
@@ -304,7 +285,6 @@
|
||||
// Stash the block and call-site queue. We'll invoke it in -displayDidFinish.
|
||||
// FIXME: _displayCompletionBlock not protected by lock
|
||||
if (_displayCompletionBlock != displayCompletionBlock) {
|
||||
[_displayCompletionBlock release];
|
||||
_displayCompletionBlock = [displayCompletionBlock copy];
|
||||
}
|
||||
|
||||
|
||||
20
AsyncDisplayKit/Details/ASDealloc2MainObject.h
Normal file
20
AsyncDisplayKit/Details/ASDealloc2MainObject.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/* Copyright (c) 2014-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/**
|
||||
* _OBJC_SUPPORTED_INLINE_REFCNT_WITH_DEALLOC2MAIN permits classes to implement their own reference counting and enforce
|
||||
* deallocation on the main thread, but requires manual reference counting. This superclass exposes such functionality
|
||||
* to ARC-enabled classes.
|
||||
*/
|
||||
@interface ASDealloc2MainObject : NSObject
|
||||
|
||||
- (BOOL)_isDeallocating;
|
||||
|
||||
@end
|
||||
32
AsyncDisplayKit/Details/ASDealloc2MainObject.m
Normal file
32
AsyncDisplayKit/Details/ASDealloc2MainObject.m
Normal file
@@ -0,0 +1,32 @@
|
||||
/* Copyright (c) 2014-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
#import "ASDealloc2MainObject.h"
|
||||
|
||||
#import <pthread.h>
|
||||
|
||||
#import "_AS-objc-internal.h"
|
||||
|
||||
#if __has_feature(objc_arc)
|
||||
#error This file must be compiled without ARC. Use -fno-objc-arc.
|
||||
#endif
|
||||
|
||||
@interface ASDealloc2MainObject ()
|
||||
{
|
||||
@private
|
||||
int _retainCount;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation ASDealloc2MainObject
|
||||
|
||||
#if !__has_feature(objc_arc)
|
||||
_OBJC_SUPPORTED_INLINE_REFCNT_WITH_DEALLOC2MAIN(_retainCount);
|
||||
#endif
|
||||
|
||||
@end
|
||||
@@ -19,11 +19,15 @@
|
||||
|
||||
@interface _ASDisplayView ()
|
||||
@property (nonatomic, assign, readwrite) ASDisplayNode *asyncdisplaykit_node;
|
||||
|
||||
// Keep the node alive while its view is active. If you create a view, add its layer to a layer hierarchy, then release
|
||||
// the view, the layer retains the view to prevent a crash. This replicates this behaviour for the node abstraction.
|
||||
@property (nonatomic, retain, readwrite) ASDisplayNode *keepalive_node;
|
||||
@end
|
||||
|
||||
@implementation _ASDisplayView
|
||||
{
|
||||
ASDisplayNode *_node; // Though UIView has a .node property added via category, since we can add an ivar to a subclass, use that for performance.
|
||||
__unsafe_unretained ASDisplayNode *_node; // Though UIView has a .node property added via category, since we can add an ivar to a subclass, use that for performance.
|
||||
BOOL _inHitTest;
|
||||
BOOL _inPointInside;
|
||||
}
|
||||
@@ -66,10 +70,10 @@
|
||||
// view).
|
||||
UIView *currentSuperview = self.superview;
|
||||
if (!currentSuperview && newSuperview) {
|
||||
[_node retain];
|
||||
self.keepalive_node = _node;
|
||||
}
|
||||
else if (currentSuperview && !newSuperview) {
|
||||
[_node release];
|
||||
self.keepalive_node = nil;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ BOOL ASDisplayNodeSubclassOverridesSelector(Class subclass, SEL selector);
|
||||
@interface ASDisplayNode () <_ASDisplayLayerDelegate>
|
||||
{
|
||||
@protected
|
||||
int _retainCount;
|
||||
ASDN::RecursiveMutex _propertyLock; // Protects access to the _view, _pendingViewState, _subnodes, _supernode, _renderingSubnodes, and other properties which are accessed from multiple threads.
|
||||
|
||||
ASDisplayNode *_supernode;
|
||||
|
||||
@@ -185,23 +185,6 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[contents release];
|
||||
[name release];
|
||||
if (NULL != shadowColor)
|
||||
CFRelease(shadowColor);
|
||||
if (NULL != borderColor)
|
||||
CFRelease(borderColor);
|
||||
if (NULL != backgroundColor)
|
||||
CFRelease(backgroundColor);
|
||||
[accessibilityLabel release];
|
||||
[accessibilityHint release];
|
||||
[accessibilityValue release];
|
||||
[accessibilityLanguage release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (CALayer *)layer
|
||||
{
|
||||
ASDisplayNodeAssert(NO, @"One shouldn't call node.layer when the view isn't loaded, but we're returning nil to not crash if someone is still doing this");
|
||||
@@ -288,8 +271,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
[contents release];
|
||||
contents = [newContents retain];
|
||||
contents = newContents;
|
||||
_flags.setContents = YES;
|
||||
}
|
||||
|
||||
@@ -420,14 +402,13 @@
|
||||
{
|
||||
_flags.setName = YES;
|
||||
if (name != newName) {
|
||||
[name release];
|
||||
name = [newName copy];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)asyncdisplaykit_name
|
||||
{
|
||||
return [[name retain] autorelease];
|
||||
return name;
|
||||
}
|
||||
|
||||
- (BOOL)isAccessibilityElement
|
||||
@@ -443,39 +424,36 @@
|
||||
|
||||
- (NSString *)accessibilityLabel
|
||||
{
|
||||
return [[accessibilityLabel retain] autorelease];
|
||||
return accessibilityLabel;
|
||||
}
|
||||
|
||||
- (void)setAccessibilityLabel:(NSString *)newAccessibilityLabel
|
||||
{
|
||||
_flags.setAccessibilityLabel = YES;
|
||||
if (accessibilityLabel != newAccessibilityLabel) {
|
||||
[accessibilityLabel release];
|
||||
accessibilityLabel = [newAccessibilityLabel copy];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)accessibilityHint
|
||||
{
|
||||
return [[accessibilityHint retain] autorelease];
|
||||
return accessibilityHint;
|
||||
}
|
||||
|
||||
- (void)setAccessibilityHint:(NSString *)newAccessibilityHint
|
||||
{
|
||||
_flags.setAccessibilityHint = YES;
|
||||
[accessibilityHint release];
|
||||
accessibilityHint = [newAccessibilityHint copy];
|
||||
}
|
||||
|
||||
- (NSString *)accessibilityValue
|
||||
{
|
||||
return [[accessibilityValue retain] autorelease];
|
||||
return accessibilityValue;
|
||||
}
|
||||
|
||||
- (void)setAccessibilityValue:(NSString *)newAccessibilityValue
|
||||
{
|
||||
_flags.setAccessibilityValue = YES;
|
||||
[accessibilityValue release];
|
||||
accessibilityValue = [newAccessibilityValue copy];
|
||||
}
|
||||
|
||||
@@ -503,16 +481,13 @@
|
||||
|
||||
- (NSString *)accessibilityLanguage
|
||||
{
|
||||
return [[accessibilityLanguage retain] autorelease];
|
||||
return accessibilityLanguage;
|
||||
}
|
||||
|
||||
- (void)setAccessibilityLanguage:(NSString *)newAccessibilityLanguage
|
||||
{
|
||||
_flags.setAccessibilityLanguage = YES;
|
||||
if(accessibilityLanguage != newAccessibilityLanguage) {
|
||||
[accessibilityLanguage release];
|
||||
accessibilityLanguage = [newAccessibilityLanguage retain];
|
||||
}
|
||||
accessibilityLanguage = newAccessibilityLanguage;
|
||||
}
|
||||
|
||||
- (BOOL)accessibilityElementsHidden
|
||||
|
||||
Reference in New Issue
Block a user