fix memory leaks

This commit is contained in:
Horcrux
2016-08-06 22:57:15 +08:00
parent 7f4eb47f81
commit 43de62650b
5 changed files with 70 additions and 48 deletions
+40 -29
View File
@@ -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
View File
@@ -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;
}
+8 -3
View File
@@ -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];