1

Webサービスを使用してさまざまなタイプのグラフを生成するためにコアプロットを使用しています。しかし、約60のグラフを生成した後、グラフ画面が空白になり、デバイスログに「コアアニメーションが9997432バイトを割り当てられませんでした」というメッセージが表示されます。この問題のみが発生しています。アプリがシミュレーターで正常に実行されるデバイス上。

以下はコードスニペットです。別のクラスから以下のクラスにデータを渡します。.hファイル

//
//  LineGraph.h
//  Graphs
//
//  Created by Pawan on 12/12/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "CorePlot-CocoaTouch.h"


@interface LineGraph1 : UIViewController<CPTPlotDataSource,UIPopoverControllerDelegate,CPTScatterPlotDelegate,CPTPlotSpaceDelegate> {

    NSMutableArray *xAxisValuesArray;
    NSMutableArray *yAxisValuesArray;
    NSMutableArray *identifierArray;
    NSMutableArray *xAxisScaleArray;
    NSMutableArray *formattedDataLabelArray;

    NSString  *graphTitleLabel;
    NSString *lineType;
    NSString *xAxisTitleLabel;
    NSString *yAxisMin;
    NSString *yAxisMax;
    NSString *yAxisIntervalLength;
    NSString *yAxisTitle;
    NSString *yAxisTitleLocation;
    UILabel *valueLabel2;


    float xAxiscount;
    float intervalLength;

    @private

    CPTXYGraph *lineGraph;
    CPTMutableTextStyle *titleTextStyle;
    CPTLayerAnnotation   *symbolTextAnnotation;

    NSMutableArray *plotSymbolColoursArray;
    NSMutableArray *plotLineColoursArray;

    IBOutlet CPTGraphHostingView *lineGraphtView;
    IBOutlet UILabel *lineGraphLabel;
    IBOutlet UISlider *lineGraphValueSlider;
    IBOutlet UIButton *drillUpButton;
    IBOutlet UIButton *drillDownButton;
    IBOutlet UIButton *helpButton;
}
@property(nonatomic,retain) IBOutlet CPTGraphHostingView *lineGraphtView;
@property(nonatomic,retain) CPTXYGraph *lineGraph;
@property(nonatomic,retain) NSMutableArray *xAxisValuesArray;
@property(nonatomic,retain) NSMutableArray *yAxisValuesArray;
@property(nonatomic,retain) IBOutlet UILabel *lineGraphLabel;
@property(nonatomic,retain) NSString *graphTitleLabel;
@property(nonatomic,retain) NSString *lineType;
@property(nonatomic,retain) NSString *xAxisTitleLabel;
@property(nonatomic,retain) NSString *yAxisTitleLocation;
@property(nonatomic,retain) NSString *yAxisMin;
@property(nonatomic,retain) NSString *yAxisMax;
@property(nonatomic,retain) NSString *yAxisIntervalLength;
@property(nonatomic,retain) NSString *yAxisTitle;
@property(nonatomic,retain) NSMutableArray *identifierArray;
@property(nonatomic,retain) NSMutableArray *plotSymbolColoursArray;
@property(nonatomic,retain) NSMutableArray *plotLineColoursArray;
@property(nonatomic,retain) NSMutableArray *xAxisScaleArray;
@property(nonatomic,retain) NSMutableArray *formattedDataLabelArray;
@property(nonatomic,retain) CPTMutableTextStyle *titleTextStyle;

- (void)constructLineGraphForSingleLineGraph:(NSString *)type;
-(IBAction)helpButtonPressed:(id)sender;
-(void)plotDataActionSlider:(id)sender;
-(void)setplotDataActionSlider;

@end



.m file




// LineGraph.m
//  Graphs
//
//  Created by Pawan on 12/12/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "LineGraph1.h"
#import "CommonMethodForGraphs.h"
#import "GraphDescription.h"

@implementation LineGraph1

@synthesize lineGraph;
@synthesize xAxisValuesArray;
@synthesize yAxisValuesArray;
@synthesize graphTitleLabel;
@synthesize lineGraphLabel;
@synthesize lineType;
@synthesize xAxisTitleLabel;
@synthesize yAxisMin;
@synthesize yAxisMax;
@synthesize yAxisIntervalLength;
@synthesize yAxisTitle;
@synthesize yAxisTitleLocation;
@synthesize identifierArray;
@synthesize plotLineColoursArray;
@synthesize plotSymbolColoursArray;
@synthesize xAxisScaleArray;
@synthesize formattedDataLabelArray;
@synthesize titleTextStyle;
@synthesize lineGraphtView;
//Implement viewDidLoad to do additional setup after loading the view, typically from a nib.


- (void)viewDidLoad {
    [super viewDidLoad];
    [self setplotDataActionSlider]; 
    self.lineGraphLabel.text=self.graphTitleLabel;
    NSMutableArray *identifierLocalArray=[[NSMutableArray alloc]init];

    [identifierLocalArray insertObject:@"Port In" atIndex:0];
    self.identifierArray=identifierLocalArray;
    [identifierLocalArray release];

    NSMutableArray *plotSymbolColoursLocalArray =[NSMutableArray arrayWithObjects:[CPTColor redColor],[CPTColor greenColor],nil];
    NSMutableArray *plotLineColoursLocalArray =[NSMutableArray arrayWithObjects:[CPTColor greenColor],[CPTColor redColor],nil];
    self.plotSymbolColoursArray=plotSymbolColoursLocalArray;    
    self.plotLineColoursArray=plotLineColoursLocalArray;

    if ([self.xAxisValuesArray count]<=10) 
    {
        xAxiscount = 10.0f;
    }
    else    
    {
        xAxiscount = 31.0f;
    }

    [self constructLineGraphForSingleLineGraph:self.lineType];

}
#pragma mark -
#pragma mark constructLineGraphForSingleLineGraph



- (void)constructLineGraphForSingleLineGraph:(NSString *)type
{

    // Create lineGraph from theme

    CPTXYGraph *lineGraphLocalObject = [[CPTXYGraph alloc] initWithFrame:CGRectZero];
    self.lineGraph = lineGraphLocalObject;
    [lineGraphLocalObject release];
    CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme];
    self.lineGraph = (CPTXYGraph *)[theme newGraph];

/*  
    UIImage *image = [UIImage imageNamed:@"BackgroundforGraph.png"];
    CGImageRef mycgimage = [image CGImage];
    CPTImage *image1 = [CPTImage imageWithCGImage:mycgimage];
    self.lineGraph.fill=[CPTFill fillWithImage:image1];
    self.lineGraph.borderLineStyle = nil;
    image = [UIImage imageNamed:@"PlotAreaImageNew.png"];
    mycgimage = [image CGImage];
    image1 = [CPTImage imageWithCGImage:mycgimage];

    self.lineGraph.plotAreaFrame.fill = [CPTFill fillWithImage:image1];
 */
    lineGraphtView.hostedGraph = self.lineGraph;
    lineGraphtView.allowPinchScaling = NO;
    self.lineGraph.plotAreaFrame.masksToBorder = NO;
    //padding for plot area
    self.lineGraph.paddingLeft = 110.0;
    self.lineGraph.paddingTop = 20.0;
    self.lineGraph.paddingRight = 10.0;
    self.lineGraph.paddingBottom = 100.0;

    // Add plot space for line graph
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.lineGraph.defaultPlotSpace;
    plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromString(self.yAxisMin) length:CPTDecimalFromString(self.yAxisMax)];
    plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(xAxiscount)];

    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.lineGraph.axisSet;

    CPTXYAxis *x = axisSet.xAxis;
    x.majorIntervalLength = CPTDecimalFromString(@"1");
    x.orthogonalCoordinateDecimal = CPTDecimalFromString(self.yAxisMin);
    x.title =self.xAxisTitleLabel;
    x.titleLocation = CPTDecimalFromFloat(5.0f);
    x.titleOffset = 65.0f;
    x.labelOffset=0.0f;

    //text style initialized for both x and y axis....
    CPTMutableTextStyle *titleTextStyleLocalObject = [[CPTMutableTextStyle alloc] init];
    self.titleTextStyle = titleTextStyleLocalObject;
    [titleTextStyleLocalObject release];
    self.titleTextStyle.fontSize = 15;
    x.titleTextStyle =  self.titleTextStyle;
    self.titleTextStyle.fontSize = 12;
    x.labelTextStyle = self.titleTextStyle;

    // Define some custom labels for the data elements
    x.labelRotation = M_PI/4;
    x.labelingPolicy = CPTAxisLabelingPolicyNone;
    int labelLocation = 0;
    NSMutableArray *customLabelsForXaxis = [NSMutableArray arrayWithCapacity:[self.xAxisScaleArray count]];

    for (NSNumber *tickLocation in self.xAxisScaleArray) 
    {
        CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText: [self.xAxisScaleArray objectAtIndex:labelLocation++] textStyle:x.labelTextStyle];
        newLabel.tickLocation = [[NSNumber numberWithInt:labelLocation] decimalValue] ;//[tickLocation decimalValue];
        newLabel.offset =0.0;
        newLabel.rotation = M_PI/4;

        [customLabelsForXaxis addObject:newLabel];
        [newLabel release];
    }

    x.axisLabels =  [NSSet setWithArray:customLabelsForXaxis];  

    NSNumberFormatter *yAxisFormat = [[NSNumberFormatter alloc] init];
    [yAxisFormat setNumberStyle:NSNumberFormatterNoStyle];
    CPTXYAxis *y = axisSet.yAxis;
    y.axisLineStyle = nil;
    y.majorIntervalLength = CPTDecimalFromString(self.yAxisIntervalLength);
    y.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0"); 
    y.titleOffset = 50.0f;
    y.titleLocation = CPTDecimalFromString(self.yAxisTitleLocation);
    y.labelOffset = 0.0f;
    y.labelFormatter=yAxisFormat;
    [yAxisFormat release];
    y.title = self.yAxisTitle;
    y.labelTextStyle =  self.titleTextStyle;

    CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease];
    dataSourceLinePlot.identifier = [self.identifierArray objectAtIndex:0];

    CPTMutableLineStyle *lineStyle = [[dataSourceLinePlot.dataLineStyle mutableCopy] autorelease];
    lineStyle.lineWidth = 2.0f;
    lineStyle.lineColor = [ self.plotLineColoursArray objectAtIndex:0];//[CPTColor clearColor];for scatterplot
    dataSourceLinePlot.dataLineStyle = lineStyle;
    dataSourceLinePlot.labelOffset=8.0f;
    dataSourceLinePlot.dataSource = self;
    dataSourceLinePlot.delegate = self;

        // Add plot symbols

    CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
    plotSymbol.fill = [CPTFill fillWithColor:[  self.plotSymbolColoursArray objectAtIndex:0]];
    plotSymbol.size = CGSizeMake(10.0, 10.0);
    dataSourceLinePlot.plotSymbol = plotSymbol;



    // Put an area gradient under the plot above
    CPTColor *areaColor = [CPTColor colorWithComponentRed:0.3 green:0.8 blue:0.3 alpha:0.6];
    CPTGradient *areaGradient = [CPTGradient gradientWithBeginningColor:areaColor endingColor:[CPTColor clearColor]];
    areaGradient.angle = -90.0;
    CPTFill* areaGradientFill = [CPTFill fillWithGradient:areaGradient];
    dataSourceLinePlot.areaFill = areaGradientFill;
    dataSourceLinePlot.areaBaseValue = CPTDecimalFromString(@"0.0");



    [self.lineGraph addPlot:dataSourceLinePlot];
    y.labelingPolicy = CPTAxisLabelingPolicyNone;
    intervalLength = [CommonMethodForGraphs formattedIntervalLengthForgraph:self.yAxisIntervalLength];


    double j=[self.yAxisMin intValue];
    NSMutableArray *customTickLocationsForYaxis = [[NSMutableArray alloc]init];
    NSMutableArray *yAxisLabels =[[NSMutableArray alloc]init];

    for (int h=0; h<=10; h++) 
    {
        [customTickLocationsForYaxis insertObject:[NSDecimalNumber numberWithLongLong:j] atIndex:h];
        [yAxisLabels insertObject:[[NSNumber numberWithLongLong:j/intervalLength]stringValue] atIndex:h];
        j=j+[self.yAxisIntervalLength longLongValue];
    }
    labelLocation = 0;
    NSMutableArray *customLabelsForYaxis = [[NSMutableArray alloc] initWithCapacity:[yAxisLabels count]];

    for (NSNumber *tickLocationForYaxis in customTickLocationsForYaxis)
    {
        CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText: [yAxisLabels objectAtIndex:labelLocation++] textStyle:x.labelTextStyle];
        newLabel.tickLocation = [tickLocationForYaxis decimalValue];
        newLabel.offset = y.labelOffset + y.majorTickLength;
        [customLabelsForYaxis addObject:newLabel];
        [newLabel release];
    }

    y.axisLabels =  [NSSet setWithArray:customLabelsForYaxis];

    [customLabelsForYaxis release];
    [customTickLocationsForYaxis release];
    [yAxisLabels release];

}


#pragma mark -
#pragma mark delegates for Line graph 

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot 
{
    int recordCount = 0;

    for (int i=0; i<[self.identifierArray count]; i++) 
    {
        if ( [plot.identifier isEqual:[self.identifierArray objectAtIndex:i] ]) 
        {
            recordCount= [self.yAxisValuesArray count];
        }

    }
    return recordCount; 
}

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 
{
    NSNumber *num = nil;

    if( [plot.identifier isEqual:[self.identifierArray objectAtIndex:0] ]) 
    {
        switch (fieldEnum) 
        {
            case CPTScatterPlotFieldX:
                num = [self.xAxisValuesArray objectAtIndex:index];
                break;

            case CPTScatterPlotFieldY:
                num = [self.yAxisValuesArray objectAtIndex:index];
                break;
        }

    }

    return num;
}


-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index
{

    static CPTMutableTextStyle *whiteText = nil;

    if ( !whiteText) 
    {
        whiteText = [[CPTMutableTextStyle alloc] init];
        whiteText.color = [CPTColor blackColor];
        whiteText.fontSize=12.0f;
    }

    CPTTextLayer *newLayer = nil;
    if (index%2==0) 
    {
        plot.labelOffset=-0.5;

    }
    else 
    {
        plot.labelOffset=0.5;
    }


    if ( [plot.identifier isEqual:[self.identifierArray objectAtIndex:0]])
    {
        newLayer = [[[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%.1f%",[[self.formattedDataLabelArray objectAtIndex:index]floatValue]] style:whiteText] autorelease];
        [whiteText release];
    }

    return newLayer;

}

-(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index
{

    if ( symbolTextAnnotation ) {
        [self.lineGraph.plotAreaFrame.plotArea removeAnnotation:symbolTextAnnotation];
        symbolTextAnnotation = nil;
    }

    // Setup a style for the annotation
    CPTMutableTextStyle *hitAnnotationTextStyle = [CPTMutableTextStyle textStyle];
    hitAnnotationTextStyle.color = [CPTColor redColor];
    hitAnnotationTextStyle.fontSize = 16.0f;
    hitAnnotationTextStyle.fontName = @"Helvetica-Bold";

    // Determine point of symbol in plot coordinates
    NSNumber *x = [self.xAxisValuesArray objectAtIndex:index];

    NSString *y = [self.yAxisValuesArray objectAtIndex:index];

    NSArray *anchorPoint = [NSArray arrayWithObjects:x, y, nil];



    // Now add the annotation to the plot area
    CPTTextLayer *textLayer = [[[CPTTextLayer alloc] initWithText:y style:hitAnnotationTextStyle] autorelease];

    symbolTextAnnotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:self.lineGraph.defaultPlotSpace anchorPlotPoint:anchorPoint];

    symbolTextAnnotation.contentLayer = textLayer;
    symbolTextAnnotation.displacement = CGPointMake(0.0f, 20.0f);
    [self.lineGraph.plotAreaFrame.plotArea addAnnotation:symbolTextAnnotation]; 
    [textLayer release];
    [symbolTextAnnotation release];
}

#pragma mark -
#pragma mark method for slider action


-(void)plotDataActionSlider:(id)sender
{


    if (lineGraphValueSlider.value<=[self.yAxisValuesArray count]+1) 
    {
            //code to remove added imageView
            [[self.view viewWithTag:50] removeFromSuperview];
            //code to remove added label
            [[self.view viewWithTag:100] removeFromSuperview];
        for (int d=0; d<[self.yAxisValuesArray count]; d++) 
        {
            if ((int)lineGraphValueSlider.value==[[self.xAxisValuesArray objectAtIndex:d]intValue]) 
            {



                int x=300;
                valueLabel2=[[UILabel alloc]init];
                valueLabel2.frame=CGRectMake(x, 620, 300, 40);
                valueLabel2.tag=100;
                NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
                [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
                NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
                [formatter setLocale:locale];
                valueLabel2.text= [[[self.xAxisScaleArray objectAtIndex:d] stringByAppendingString:@" : "] stringByAppendingString:[formatter stringFromNumber:[NSNumber numberWithLongLong:[[self.yAxisValuesArray objectAtIndex:d]longLongValue]]]];
                [self.view addSubview:valueLabel2];
                [valueLabel2 release];
                [formatter release];

            }
        }
    }
    else 
    {
        [[self.view viewWithTag:50] removeFromSuperview];
        [[self.view viewWithTag:100] removeFromSuperview];

    }



}

-(void)setplotDataActionSlider
{
    UIImage *minImage = [UIImage imageNamed:@"SliderRoll.png"];
    UIImage *tumbImage= [UIImage imageNamed:@"SliderArrow.png"];   
    minImage=[minImage stretchableImageWithLeftCapWidth:0 topCapHeight:0];
        // Setup the  slider
    [lineGraphValueSlider setMinimumTrackImage:minImage forState:UIControlStateNormal];
    [lineGraphValueSlider setThumbImage:tumbImage forState:UIControlStateNormal];
    lineGraphValueSlider.minimumValue = 0.0;

    if ([self.xAxisValuesArray count]<=10)
    {
        lineGraphValueSlider.maximumValue = 10.0;
    }
    else 
    {
        lineGraphValueSlider.maximumValue = 31.0;
    }


    lineGraphValueSlider.continuous = YES;
    [lineGraphValueSlider addTarget:self action:@selector(plotDataActionSlider :) forControlEvents:UIControlEventValueChanged];

    minImage = nil;
    tumbImage = nil;


}   

#pragma mark -
#pragma mark method for help drill up and drill down

-(IBAction)helpButtonPressed:(id)sender{
    [CommonMethodForGraphs helpButtonActionForAllGraphs:self.view];


}
#pragma mark -

//Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations.
    return ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) ||(interfaceOrientation == UIInterfaceOrientationLandscapeRight));
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];

    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.lineGraphLabel = nil;
    self.lineGraphtView = nil;
}


- (void)dealloc {

    [lineGraph release];
    [xAxisValuesArray release];
    [yAxisValuesArray release];
    [xAxisTitleLabel release];  
    [graphTitleLabel release];
    [lineGraphLabel release];
    [lineType release];
    [yAxisMin release];
    [yAxisMax release];
    [yAxisIntervalLength release];
    [yAxisTitle release];
    [yAxisTitleLocation release];
    [identifierArray release];
    [plotLineColoursArray release];
    [plotSymbolColoursArray release];
    [xAxisScaleArray release];
    [formattedDataLabelArray release];
    [lineGraphtView release];
    [super dealloc];

}



@end
4

2 に答える 2

0

これが大きな違いを生むかどうかはわかりませんが、これら2つの方法は異なるロジックを使用しているようです

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot 
{
int recordCount = 0;

for (int i=0; i<[self.identifierArray count]; i++) 
{
    if ( [plot.identifier isEqual:[self.identifierArray objectAtIndex:i] ]) 
    {
        recordCount= [self.yAxisValuesArray count];
    }
}
return recordCount; 

}

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 
{
NSNumber *num = nil;

if( [plot.identifier isEqual:[self.identifierArray objectAtIndex:0] ]) 
{
    switch (fieldEnum) 
    {
        case CPTScatterPlotFieldX:
            num = [self.xAxisValuesArray objectAtIndex:index];
            break;
        case CPTScatterPlotFieldY:
            num = [self.yAxisValuesArray objectAtIndex:index];
            break;
    }
}

return num;
}

にあるのと同じロジックを使用することをお勧めします

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index

他の方法で

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index

チャートの場合、プロットが1つしかないことを確認できますか?

于 2012-04-10T09:15:47.230 に答える
0

Are all 60 graphs in memory at the same time? If so, you're probably running out of memory or other GPU resources for Core Animation. Be sure to release graphs and/or plots that you aren't using any more to free up resources.

于 2012-04-11T00:48:06.947 に答える