Проблема с областью действия основного графика в функции numberForPlot

StackOverflow https://stackoverflow.com/questions/2827259

Вопрос

Моя проблема заключается вот в чем:Кажется, я не могу получить доступ к переменной todaysDate из функций numberForPlot или numberOfRecordsForPlot (см. numberForPlot Ниже), но я могу из любого другого места в файле.

NSLog в viewDidLoad работает отлично, дата установлена правильно.Если я обращаюсь к переменной из своих собственных функций класса, то это тоже нормально, и это работает.Однако, когда я пытаюсь получить к нему доступ из 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 - как это влияет на область видимости?

Или у меня просто ошибка в моем коде?Любая помощь очень ценится!

Это было полезно?

Решение

Проблема в том, что [NSDate date] возвращает автоматически выпущенный объект, за который вы не держитесь.Он будет зависать до конца текущего цикла цикла выполнения (почему он не завершается немедленно в вашем первом NSLog() заявление), после чего оно будет обнародовано.Когда вы пытаетесь получить к нему доступ в -numberForPlot:, он был выпущен, и ваше приложение выходит из строя.

Чтобы исправить это, измените строку в -viewDidLoad на чтение

self.todaysDate = [NSDate date];

Вы определили todaysDate быть собственностью с retain атрибут, так что при этом сохранится ваша дата.Просто не забудьте добавить [todaysDate release] в вашем -dealloc способ предотвращения утечки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top