我的 iPhone 绘图应用程序在使用喷雾 jar 工具时速度变慢。但是,当我通过运行有泄漏的应用程序来检查泄漏时,没有显示泄漏。所有其他工具都工作正常,可以帮助我解决这个问题。
我的喷雾 jar 工具类代码如下:
- init {
if ((self = [super init]))
{
trackingTouches = [[NSMutableArray array] retain];
startPoints = [[NSMutableArray array] retain];
paths = [[NSMutableArray array] retain];
}
return self;
}
- (void)activate { } - (void)deactivate {
[trackingTouches removeAllObjects];
[startPoints removeAllObjects];
[paths removeAllObjects];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// UIView *touchedView = [delegate viewForUseWithTool:self];
UITouch *theTouch = [touches anyObject];
UIView *touchedView = [delegate viewForUseWithTool:self];
endPoint = [theTouch locationInView:touchedView];
for (UITouch *touch in [event allTouches]) {
// CGFloat lineWidth=10;
// remember the touch, and its original start point, for future
[trackingTouches addObject:touch];
CGPoint location = [touch locationInView:touchedView];
[startPoints addObject:[NSValue valueWithCGPoint:location]];
UIBezierPath *path = [UIBezierPath bezierPath];
path.lineCapStyle = kCGLineCapRound;
[path moveToPoint:location];
[path setLineWidth:delegate.strokeWidth];
[path addLineToPoint:location];
[paths addObject:path];
}
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[self deactivate];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
// UITouch *theTouch = [touches anyObject];
// UIView *touchedView = [delegate viewForUseWithTool:self];
//endPoint = [theTouch locationInView:touchedView];
for (UITouch *touch in [event allTouches])
{ // make a line from the start point to the current point
NSUInteger touchIndex = [trackingTouches indexOfObject:touch];
// only if we actually remember the start of this touch...
if (touchIndex != NSNotFound) {
UIBezierPath *path = [paths objectAtIndex:touchIndex];
PathDrawingInfo *info = [PathDrawingInfo pathDrawingInfoWithPath:path fillColor:[UIColor clearColor] strokeColor:delegate.strokeColor];
[delegate addDrawable:info];
[trackingTouches removeObjectAtIndex:touchIndex];
[startPoints removeObjectAtIndex:touchIndex];
[paths removeObjectAtIndex:touchIndex];
}
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
// UIView *touchedView = [delegate viewForUseWithTool:self];
UITouch *theTouch = [touches anyObject];
UIView *touchedView = [delegate viewForUseWithTool:self];
currentpoint = [theTouch locationInView:touchedView];
//currentpoint.y -=20;
//[self drawCircle];
for (UITouch *touch in [event allTouches]) {
CGFloat lineWidth=10;
// make a line from the start point to the current point
NSUInteger touchIndex = [trackingTouches indexOfObject:touch];
UIBezierPath *path = [UIBezierPath bezierPath];
if (touchIndex != NSNotFound) {
// CGPoint location = [touch locationInView:touchedView];
UIBezierPath *path = [paths objectAtIndex:touchIndex]; UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:CGRectMake((currentpoint.x-lineWidth),( currentpoint.y-lineWidth), lineWidth*2, lineWidth*2)];
NSInteger i,x,y;
NSInteger modNumber =5*(int)lineWidth;
for (i = 0; i < (lineWidth*lineWidth)/2; i++) {
do {
x = (random() % modNumber)+currentpoint.x - lineWidth*2;
y = (random() % modNumber)+currentpoint.y - lineWidth*2;
} while (![circle containsPoint:CGPointMake(x,y)]);
[path appendPath:[UIBezierPath bezierPathWithRect:CGRectMake(x,y,0.0025,0.0025)]];
}
[path moveToPoint:currentpoint];
[path setLineWidth:delegate.strokeWidth];
[path addLineToPoint:currentpoint];
// only if we actually remember the start of this touch...
}
[paths addObject:path];;
}
}
- (void)drawTemporary {
for (UIBezierPath *path in paths) {
[delegate.strokeColor setStroke];
[path stroke];
}
}
- (void)dealloc {
[trackingTouches release];
trackingTouches = nil;
[startPoints release];
startPoints = nil;
[paths release];
paths = nil;
self.delegate = nil;
[super dealloc];
}
最佳答案
在h block 中定义属性并在m block 中综合。
<br/><br/>
@property (nonatomic, retain) NSMutableArray *trackingTouches;<br/>
@property (nonatomic, retain) NSMutableArray *startPoints; <br/>
@property (nonatomic, retain) NSMutableArray *paths;<br/>
@synthesize trackingTouches,startPoints,paths;<br/>
并像这样使用 dealloc block
- (void)dealloc {
[self setTrackingTouches:nil];
[self setStartPoints:nil];
[self setPaths:nil];
self.delegate = nil;
[super dealloc];
}
关于ios4 - iPhone应用程序性能下降但没有任何内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6095901/