mirror of
https://github.com/zoriya/react-native-svg.git
synced 2026-06-02 06:35:04 +00:00
fix memory leaks
This commit is contained in:
+40
-29
@@ -15,27 +15,30 @@
|
||||
RNSVGSvgView* svg = [self getSvgView];
|
||||
[self clip:context];
|
||||
|
||||
for (RNSVGNode *node in self.subviews) {
|
||||
if ([node isKindOfClass:[RNSVGNode class]]) {
|
||||
[node mergeProperties:self mergeList:self.propList inherited:YES];
|
||||
[node renderTo:context];
|
||||
|
||||
if (node.responsible && !svg.responsible) {
|
||||
svg.responsible = YES;
|
||||
}
|
||||
[self traverseSubviews:^(RNSVGNode *node) {
|
||||
if (node.responsible && !svg.responsible) {
|
||||
svg.responsible = YES;
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
return YES;
|
||||
}];
|
||||
|
||||
[self traverseSubviews:^(RNSVGNode *node) {
|
||||
[node mergeProperties:self mergeList:self.propList inherited:YES];
|
||||
[node renderTo:context];
|
||||
return YES;
|
||||
}];
|
||||
}
|
||||
|
||||
- (CGPathRef)getPath:(CGContextRef)context
|
||||
{
|
||||
CGMutablePathRef path = CGPathCreateMutable();
|
||||
for (RNSVGNode *node in self.subviews) {
|
||||
if ([node isKindOfClass:[RNSVGNode class]]) {
|
||||
CGAffineTransform transform = node.matrix;
|
||||
CGPathAddPath(path, &transform, [node getPath:context]);
|
||||
}
|
||||
}
|
||||
[self traverseSubviews:^(RNSVGNode *node) {
|
||||
CGAffineTransform transform = node.matrix;
|
||||
CGPathAddPath(path, &transform, [node getPath:context]);
|
||||
return YES;
|
||||
}];
|
||||
|
||||
return (CGPathRef)CFAutorelease(path);
|
||||
}
|
||||
|
||||
@@ -47,9 +50,7 @@
|
||||
if ([node isKindOfClass:[RNSVGNode class]]) {
|
||||
if (event) {
|
||||
node.active = NO;
|
||||
}
|
||||
|
||||
if (node.active) {
|
||||
} else if (node.active) {
|
||||
return node;
|
||||
}
|
||||
|
||||
@@ -76,29 +77,39 @@
|
||||
[svg defineTemplate:self templateRef:self.name];
|
||||
}
|
||||
|
||||
for (RNSVGNode *node in self.subviews) {
|
||||
if ([node isKindOfClass:[RNSVGNode class]]) {
|
||||
[node saveDefinition];
|
||||
}
|
||||
}
|
||||
[self traverseSubviews:^(RNSVGNode *node) {
|
||||
[node saveDefinition];
|
||||
return YES;
|
||||
}];
|
||||
|
||||
}
|
||||
|
||||
- (void)mergeProperties:(__kindof RNSVGNode *)target mergeList:(NSArray<NSString *> *)mergeList
|
||||
{
|
||||
for (RNSVGNode *node in self.subviews) {
|
||||
if ([node isKindOfClass:[RNSVGNode class]]) {
|
||||
[node mergeProperties:target mergeList:mergeList];
|
||||
}
|
||||
}
|
||||
[self traverseSubviews:^(RNSVGNode *node) {
|
||||
[node mergeProperties:target mergeList:mergeList];
|
||||
return YES;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)resetProperties
|
||||
{
|
||||
[self traverseSubviews:^(RNSVGNode *node) {
|
||||
[node resetProperties];
|
||||
return YES;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)traverseSubviews:(BOOL (^)(RNSVGNode *node))block
|
||||
{
|
||||
for (RNSVGNode *node in self.subviews) {
|
||||
if ([node isKindOfClass:[RNSVGNode class]]) {
|
||||
[node resetProperties];
|
||||
if (!block(node)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
+19
-13
@@ -28,25 +28,31 @@
|
||||
|
||||
- (void)renderLayerTo:(CGContextRef)context
|
||||
{
|
||||
CGPathRef path = [self getPath:context];
|
||||
if (!self.d) {
|
||||
self.d = [self getPath:context];;
|
||||
}
|
||||
CGPathRef path = self.d;
|
||||
if ((!self.fill && !self.stroke) || !path) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Add path to hitArea
|
||||
CGMutablePathRef hitArea = CGPathCreateMutableCopy(path);
|
||||
if (self.stroke) {
|
||||
// Add stroke to hitArea
|
||||
CGPathRef strokePath = CGPathCreateCopyByStrokingPath(hitArea, nil, self.strokeWidth, self.strokeLinecap, self.strokeLinejoin, self.strokeMiterlimit);
|
||||
CGPathAddPath(hitArea, nil, strokePath);
|
||||
CGPathRelease(strokePath);
|
||||
if ([self getSvgView].responsible) {
|
||||
NSLog(@"asdasdasdsadas");
|
||||
|
||||
// Add path to hitArea
|
||||
CGMutablePathRef hitArea = CGPathCreateMutableCopy(path);
|
||||
if (self.stroke) {
|
||||
// Add stroke to hitArea
|
||||
CGPathRef strokePath = CGPathCreateCopyByStrokingPath(hitArea, nil, self.strokeWidth, self.strokeLinecap, self.strokeLinejoin, self.strokeMiterlimit);
|
||||
CGPathAddPath(hitArea, nil, strokePath);
|
||||
CGPathRelease(strokePath);
|
||||
}
|
||||
|
||||
CGAffineTransform transform = self.matrix;
|
||||
self.hitArea = CFAutorelease(CGPathCreateCopyByTransformingPath(hitArea, &transform));
|
||||
CGPathRelease(hitArea);
|
||||
}
|
||||
|
||||
CGAffineTransform transform = self.matrix;
|
||||
self.hitArea = CGPathCreateCopyByTransformingPath(hitArea, &transform);
|
||||
|
||||
CGPathRelease(hitArea);
|
||||
|
||||
if (self.opacity == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -50,14 +50,19 @@
|
||||
|
||||
for (RNSVGNode *node in self.subviews) {
|
||||
if ([node isKindOfClass:[RNSVGNode class]]) {
|
||||
[node saveDefinition];
|
||||
[node renderTo:context];
|
||||
|
||||
if (node.responsible && !self.responsible) {
|
||||
self.responsible = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (RNSVGNode *node in self.subviews) {
|
||||
if ([node isKindOfClass:[RNSVGNode class]]) {
|
||||
[node saveDefinition];
|
||||
[node renderTo:context];
|
||||
}
|
||||
}
|
||||
// CGImageRef image = CGBitmapContextCreateImage(context);
|
||||
// NSData *imageData = UIImagePNGRepresentation([[UIImage alloc] initWithCGImage:image]);
|
||||
// NSString *base64 = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
|
||||
|
||||
Reference in New Issue
Block a user