2011-12-22 45 views
2

我发布了很多代码,但问题是相对简单的: 我试图创建一个CTPXYGraph作为一个独立的对象,然后将它用作另一个ViewController中的hostedGraph。创建CorePlot图

由于某种原因,它崩溃了! (获取我的汇编代码与EXC_BAD_ACCESS信号)

的视图控制器:

RealTimePlot *plot = [[RealTimePlot alloc] init]; 
CTPXYGraph *graph = [plot createGraph]; 
self.graphHostingView.hostedGraph = graph; 

的graphObject:

#import "CorePlot-CocoaTouch.h" 

@interface RealTimePlot : NSObject <CPTPlotDataSource> 
{ 
NSMutableArray *dataForPlot; 
} 

@property (readwrite, strong) NSMutableArray *dataForPlot; 

- (CPTXYGraph *) createGraph; 

@end 

实现:

@implementation RealTimePlot 
@synthesize dataForPlot; 

- (CPTXYGraph *) createGraph: 
// Create graph from theme 
CPTXYGraph *graph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; 
CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; 
[graph applyTheme:theme]; 

graph.paddingLeft = 10.0; 
graph.paddingTop = 10.0; 
graph.paddingRight = 10.0; 
graph.paddingBottom = 10.0; 

// Setup plot space 
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; 
plotSpace.allowsUserInteraction = YES; 
plotSpace.xRange    = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.0) length:CPTDecimalFromFloat(2.0)]; 
plotSpace.yRange    = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.0) length:CPTDecimalFromFloat(3.0)]; 

// Axes 
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; 
CPTXYAxis *x   = axisSet.xAxis; 
x.majorIntervalLength   = CPTDecimalFromString(@"0.5"); 
x.orthogonalCoordinateDecimal = CPTDecimalFromString(@"2"); 
x.minorTicksPerInterval  = 2; 
NSArray *exclusionRanges = [NSArray arrayWithObjects: 
          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.99) length:CPTDecimalFromFloat(0.02)], 
          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.99) length:CPTDecimalFromFloat(0.02)], 
          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(2.99) length:CPTDecimalFromFloat(0.02)], 
          nil]; 
x.labelExclusionRanges = exclusionRanges; 

CPTXYAxis *y = axisSet.yAxis; 
y.majorIntervalLength   = CPTDecimalFromString(@"0.5"); 
y.minorTicksPerInterval  = 5; 
y.orthogonalCoordinateDecimal = CPTDecimalFromString(@"2"); 
exclusionRanges    = [NSArray arrayWithObjects: 
           [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.99) length:CPTDecimalFromFloat(0.02)], 
           [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.99) length:CPTDecimalFromFloat(0.02)], 
           [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(3.99) length:CPTDecimalFromFloat(0.02)], 
           nil]; 
y.labelExclusionRanges = exclusionRanges; 

// Create a blue plot area 
CPTScatterPlot *boundLinePlot = [[CPTScatterPlot alloc] init]; 
CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; 
lineStyle.miterLimit  = 1.0f; 
lineStyle.lineWidth   = 3.0f; 
lineStyle.lineColor   = [CPTColor blueColor]; 
boundLinePlot.dataLineStyle = lineStyle; 
boundLinePlot.identifier = @"Blue Plot"; 
boundLinePlot.dataSource = self; 
[graph addPlot:boundLinePlot]; 

// Do a blue gradient 
CPTColor *areaColor1  = [CPTColor colorWithComponentRed:0.3 green:0.3 blue:1.0 alpha:0.8]; 
CPTGradient *areaGradient1 = [CPTGradient gradientWithBeginningColor:areaColor1 endingColor:[CPTColor clearColor]]; 
areaGradient1.angle = -90.0f; 
CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient1]; 
boundLinePlot.areaFill  = areaGradientFill; 
boundLinePlot.areaBaseValue = [[NSDecimalNumber zero] decimalValue]; 

// Add plot symbols 
CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle]; 
symbolLineStyle.lineColor = [CPTColor blackColor]; 
CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; 
plotSymbol.fill   = [CPTFill fillWithColor:[CPTColor blueColor]]; 
plotSymbol.lineStyle  = symbolLineStyle; 
plotSymbol.size   = CGSizeMake(10.0, 10.0); 
boundLinePlot.plotSymbol = plotSymbol; 

// Create a green plot area 
CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init]; 
lineStyle      = [CPTMutableLineStyle lineStyle]; 
lineStyle.lineWidth    = 3.f; 
lineStyle.lineColor    = [CPTColor greenColor]; 
lineStyle.dashPattern   = [NSArray arrayWithObjects:[NSNumber numberWithFloat:5.0f], [NSNumber numberWithFloat:5.0f], nil]; 
dataSourceLinePlot.dataLineStyle = lineStyle; 
dataSourceLinePlot.identifier = @"Green Plot"; 
dataSourceLinePlot.dataSource = self; 

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

// Animate in the new plot, as an example 
dataSourceLinePlot.opacity = 0.0f; 
[graph addPlot:dataSourceLinePlot]; 

CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
fadeInAnimation.duration   = 1.0f; 
fadeInAnimation.removedOnCompletion = NO; 
fadeInAnimation.fillMode   = kCAFillModeForwards; 
fadeInAnimation.toValue    = [NSNumber numberWithFloat:1.0]; 
[dataSourceLinePlot addAnimation:fadeInAnimation forKey:@"animateOpacity"]; 

// Add some initial data 
NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; 
NSUInteger i; 
for (i = 0; i < 60; i++) { 
    id x = [NSNumber numberWithFloat:1 + i * 0.05]; 
    id y = [NSNumber numberWithFloat:1.2 * rand()/(float)RAND_MAX + 1.2]; 
    [contentArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:x, @"x", y, @"y", nil]]; 
} 
self.dataForPlot = contentArray; 

return graph; 
} 
+0

您将需要给我们一个堆栈跟踪,并告诉我们在哪些行崩溃之前,我们将能够开始调试。 – 2011-12-22 21:59:23

+0

你能发布你的崩溃日志吗?您还使用哪种版本的CorePlot? – 2011-12-22 17:05:20

+0

我正在使用最新版本(v0.9)。作为一个静态库。它得到EXC_BAD_ACCESS – Rizon 2011-12-22 17:10:35

回答

2
RealTimePlot *plot = [[RealTimePlot alloc] init]; 

越来越dealloc-编辑。

事实证明,CPTGraphHostingView不会保留它的hostedGraph ivar。