diff --git a/AsyncDisplayKit/ASDisplayNode+Beta.h b/AsyncDisplayKit/ASDisplayNode+Beta.h index 0cdb997903..e0a0e2696a 100644 --- a/AsyncDisplayKit/ASDisplayNode+Beta.h +++ b/AsyncDisplayKit/ASDisplayNode+Beta.h @@ -20,7 +20,7 @@ void ASPerformBlockOnBackgroundThread(void (^block)()); // DISPATCH_QUEUE_PRIORI ASDISPLAYNODE_EXTERN_C_END #if ASEVENTLOG_ENABLE -#define ASDisplayNodeLogEvent(node, ...) [node.eventLog logEventWithBacktrace:[NSThread callStackSymbols] format:__VA_ARGS__] +#define ASDisplayNodeLogEvent(node, ...) [node.eventLog logEventWithBacktrace:(AS_SAVE_EVENT_BACKTRACES ? [NSThread callStackSymbols] : nil) format:__VA_ARGS__] #else #define ASDisplayNodeLogEvent(node, ...) #endif diff --git a/AsyncDisplayKit/Details/ASDataController.h b/AsyncDisplayKit/Details/ASDataController.h index 5cd7134cdf..21f8b62f6f 100644 --- a/AsyncDisplayKit/Details/ASDataController.h +++ b/AsyncDisplayKit/Details/ASDataController.h @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN #if ASEVENTLOG_ENABLE -#define ASDataControllerLogEvent(dataController, ...) [dataController.eventLog logEventWithBacktrace:[NSThread callStackSymbols] format:__VA_ARGS__] +#define ASDataControllerLogEvent(dataController, ...) [dataController.eventLog logEventWithBacktrace:(AS_SAVE_EVENT_BACKTRACES ? [NSThread callStackSymbols] : nil) format:__VA_ARGS__] #else #define ASDataControllerLogEvent(dataController, ...) #endif diff --git a/AsyncDisplayKit/Details/ASEventLog.h b/AsyncDisplayKit/Details/ASEventLog.h index a4ecbbcf5b..95c2fb0f59 100644 --- a/AsyncDisplayKit/Details/ASEventLog.h +++ b/AsyncDisplayKit/Details/ASEventLog.h @@ -18,8 +18,12 @@ #define ASEVENTLOG_ENABLE 1 #endif +NS_ASSUME_NONNULL_BEGIN + @interface ASEventLog : NSObject -- (void)logEventWithBacktrace:(NSArray *)backtrace format:(NSString *)format, ... NS_FORMAT_FUNCTION(2, 3); +- (void)logEventWithBacktrace:(nullable NSArray *)backtrace format:(NSString *)format, ... NS_FORMAT_FUNCTION(2, 3); @end + +NS_ASSUME_NONNULL_END diff --git a/AsyncDisplayKit/Details/ASTraceEvent.h b/AsyncDisplayKit/Details/ASTraceEvent.h index 3253e3cbe6..22267fafa2 100644 --- a/AsyncDisplayKit/Details/ASTraceEvent.h +++ b/AsyncDisplayKit/Details/ASTraceEvent.h @@ -8,18 +8,23 @@ #import +NS_ASSUME_NONNULL_BEGIN + @interface ASTraceEvent : NSObject /** * This method is dealloc safe. */ - (instancetype)initWithObject:(id)object - backtrace:(NSArray *)backtrace + backtrace:(nullable NSArray *)backtrace format:(NSString *)format arguments:(va_list)arguments NS_FORMAT_FUNCTION(3,0); -@property (nonatomic, readonly) NSArray *backtrace; +// Will be nil unless AS_SAVE_EVENT_BACKTRACES=1 (default=0) +@property (nonatomic, nullable, readonly) NSArray *backtrace; @property (nonatomic, strong, readonly) NSString *message; @property (nonatomic, readonly) NSTimeInterval timestamp; @end + +NS_ASSUME_NONNULL_END diff --git a/AsyncDisplayKit/Details/ASTraceEvent.m b/AsyncDisplayKit/Details/ASTraceEvent.m index 8041bd952f..598cbeea21 100644 --- a/AsyncDisplayKit/Details/ASTraceEvent.m +++ b/AsyncDisplayKit/Details/ASTraceEvent.m @@ -46,9 +46,7 @@ } _threadDescription = threadDescription; - // The backtrace will be an _NSCallStackArray which is actually pretty - // huge and retains other objects. Create an immutable NSArray from it. - _backtrace = [[NSArray alloc] initWithArray:backtrace]; + _backtrace = backtrace; _timestamp = CACurrentMediaTime() - refTime; } return self; diff --git a/Base/ASBaseDefines.h b/Base/ASBaseDefines.h index bfa3de4aec..4d0fd5d5ca 100755 --- a/Base/ASBaseDefines.h +++ b/Base/ASBaseDefines.h @@ -96,6 +96,17 @@ # define ASDISPLAYNODE_NOTHROW #endif +/** + * The event backtraces take a static 2KB of memory + * and retain all objects present in all the registers + * of the stack frames. The memory consumption impact + * is too significant even to be enabled during general + * development. + */ +#ifndef AS_SAVE_EVENT_BACKTRACES +# define AS_SAVE_EVENT_BACKTRACES 0 +#endif + #define ARRAY_COUNT(x) sizeof(x) / sizeof(x[0]) #ifndef __has_feature // Optional.