代码之家  ›  专栏  ›  技术社区  ›  David Conlisk

NumberForPlot函数中的核心图范围问题

  •  0
  • David Conlisk  · 技术社区  · 14 年前

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

    viewdidLoad中的nslog工作正常,日期设置正确。如果我从我自己的类函数中访问变量,那么这也很好,它也可以工作。但是,当我尝试从NumberForPlot访问它时,会得到一个错误:

    程序接收信号:_156;exc_bad_access_157;。

    在我的头文件中,我有以下内容-注意,我的类实现了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 回复  |  直到 14 年前
        1
  •  2
  •   Brad Larson    14 年前

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

    要修复此问题,请将-viewdidload中的行更改为read

    self.todaysDate = [NSDate date];
    

    你定义 todaysDate 作为一个财产 retain 属性,这样将保留您的日期。只需记住添加 [todaysDate release] 在你 -dealloc 防止泄漏的方法。