numberPlot函数中的Core Plot范围问题

时间:2010-05-13 13:46:56

标签: iphone objective-c iphone-sdk-3.0 core-plot

我的问题是:我似乎无法从numberForPlot或numberOfRecordsForPlot函数访问变量todaysDate(请参阅下面的numberForPlot),但我可以从文件中的任何其他位置访问。

viewDidLoad中的NSLog工作正常,日期设置正确。如果我从我自己的类函数中访问变量,那么它也很好并且它可以工作。但是,当我尝试从numberForPlot访问它时,我收到一个错误:

  

编程接收信号:“EXC_BAD_ACCESS”。

在我的头文件中,我有以下内容 - 请注意我的类实现了CPPlotDataSource。

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

@interface ResultsGraphViewController : UIViewController <CPPlotDataSource> {
    NSManagedObjectContext *managedObjectContext;
    CPXYGraph *graph;
    NSMutableArray *eventsArray;
    NSDate *todaysDate;
}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSMutableArray *eventsArray;
@property (nonatomic, retain) NSDate *todaysDate;

- (void)getEvents;
- (void)configureGraph;

@end

在实施文件中,我有(仅限相关要点):

@synthesize managedObjectContext;
@synthesize eventsArray;
@synthesize todaysDate;

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setTitle:@"Results"];

    todaysDate = [NSDate date];
    NSLog(@"Set today's date to %@", todaysDate);
    [self getEvents];
    [self configureGraph];
}

-(NSNumber *)numberForPlot:(CPPlot *)plot 
 field:(NSUInteger)fieldEnum 
 recordIndex:(NSUInteger)index 
{ 
NSLog(@"%d events in the array.", [eventsArray count]);
NSLog(@"today's date is %@.", todaysDate);

...

}

(在上面的最后两行中,成功输出了数组中的事件数,但最后一行导致了错误。)

关于为什么这是一个问题的任何想法,以及我如何解决它?我想这与CPPlotDataSource有关 - 这如何影响范围?

或者我的代码中只有错误?所有人都非常感谢!

1 个答案:

答案 0 :(得分:2)

问题是[NSDate date]返回一个自动释放的对象,你不能保留它。它会一直存在,直到运行循环的当前循环结束(为什么它不会在你的第一个NSLog()语句中立即崩溃),然后它将被释放。当您尝试在-numberForPlot:中访问它时,它已被释放,您的应用程序崩溃。

要解决此问题,请将-viewDidLoad中的行更改为

self.todaysDate = [NSDate date];

您将todaysDate定义为具有retain属性的属性,因此这将保留您的日期。只需记住在[todaysDate release]方法中添加-dealloc即可防止泄密。