Проблема с областью действия основного графика в функции numberForPlot
-
26-09-2019 - |
Вопрос
Моя проблема заключается вот в чем:Кажется, я не могу получить доступ к переменной 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
способ предотвращения утечки.