我的问题是:我似乎无法从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有关 - 这如何影响范围?
或者我的代码中只有错误?所有人都非常感谢!
答案 0 :(得分:2)
问题是[NSDate date]
返回一个自动释放的对象,你不能保留它。它会一直存在,直到运行循环的当前循环结束(为什么它不会在你的第一个NSLog()
语句中立即崩溃),然后它将被释放。当您尝试在-numberForPlot:
中访问它时,它已被释放,您的应用程序崩溃。
要解决此问题,请将-viewDidLoad中的行更改为
self.todaysDate = [NSDate date];
您将todaysDate
定义为具有retain
属性的属性,因此这将保留您的日期。只需记住在[todaysDate release]
方法中添加-dealloc
即可防止泄密。