Skip to content

Commit 7d8f347

Browse files
authored
fix(ios): break retain cycle between renderers and RendererFactory (#284)
Each renderer subclass held a strong reference to RendererFactory, which itself caches renderers in a strong-keyed dictionary. This created a retain cycle that ARC could not break, causing the factory and all renderers (plus their StyleConfig instances) to leak on every props update. The fix is to make the renderer's reference to the factory __weak, matching the pattern already used in ThematicBreakRenderer.m. AttributedRenderer.m remains strong since it is the actual owner of the factory. Verified via Instruments Leaks template before/after: previously the top of the leak list was dominated by RendererFactory, all renderer subclasses, and StyleConfig (~9 KiB each); after the fix, none of these classes appear in the leak list.
1 parent dec4a37 commit 7d8f347

15 files changed

Lines changed: 15 additions & 15 deletions

ios/renderer/BlockquoteRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
static NSString *const kNestedInfoRangeKey = @"range";
1111

1212
@implementation BlockquoteRenderer {
13-
RendererFactory *_rendererFactory;
13+
__weak RendererFactory *_rendererFactory;
1414
StyleConfig *_config;
1515
}
1616

ios/renderer/CodeBlockRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#import "StyleConfig.h"
99

1010
@implementation CodeBlockRenderer {
11-
RendererFactory *_rendererFactory;
11+
__weak RendererFactory *_rendererFactory;
1212
StyleConfig *_config;
1313
}
1414

ios/renderer/CodeRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#import <React/RCTFont.h>
1010

1111
@implementation CodeRenderer {
12-
RendererFactory *_rendererFactory;
12+
__weak RendererFactory *_rendererFactory;
1313
StyleConfig *_config;
1414
}
1515

ios/renderer/ENRMImageRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
static const unichar kZeroWidthSpace = 0x200B;
1010

1111
@implementation ENRMImageRenderer {
12-
RendererFactory *_rendererFactory;
12+
__weak RendererFactory *_rendererFactory;
1313
StyleConfig *_config;
1414
}
1515

ios/renderer/ENRMMathInlineRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#if ENRICHED_MARKDOWN_MATH
1111

1212
@implementation ENRMMathInlineRenderer {
13-
RendererFactory *_rendererFactory;
13+
__weak RendererFactory *_rendererFactory;
1414
StyleConfig *_config;
1515
}
1616

ios/renderer/ENRMSpoilerRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#import "RendererFactory.h"
66

77
@implementation ENRMSpoilerRenderer {
8-
RendererFactory *_rendererFactory;
8+
__weak RendererFactory *_rendererFactory;
99
}
1010

1111
- (instancetype)initWithRendererFactory:(id)rendererFactory config:(__unused id)config

ios/renderer/EmphasisRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#import <React/RCTFont.h>
88

99
@implementation EmphasisRenderer {
10-
RendererFactory *_rendererFactory;
10+
__weak RendererFactory *_rendererFactory;
1111
StyleConfig *_config;
1212
}
1313

ios/renderer/HeadingRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
@"heading-4", @"heading-5", @"heading-6"};
2121

2222
@implementation HeadingRenderer {
23-
RendererFactory *_rendererFactory;
23+
__weak RendererFactory *_rendererFactory;
2424
StyleConfig *_config;
2525
}
2626

ios/renderer/LinkRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#import <React/RCTFont.h>
77

88
@implementation LinkRenderer {
9-
RendererFactory *_rendererFactory;
9+
__weak RendererFactory *_rendererFactory;
1010
StyleConfig *_config;
1111
}
1212

ios/renderer/ListItemRenderer.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ - (void)applyCheckedDecorationsTo:(NSMutableAttributedString *)output
2121
@end
2222

2323
@implementation ListItemRenderer {
24-
RendererFactory *_rendererFactory;
24+
__weak RendererFactory *_rendererFactory;
2525
StyleConfig *_config;
2626
}
2727

0 commit comments

Comments
 (0)