[__NSArrayI count]: сообщение отправлено на освобожденный экземпляр iPhone

У меня есть метод, который рисует точечные диаграммы, и я получаю сообщение об ошибке [__NSArrayI count]: сообщение отправлено в освобожденный экземпляр.

Я сделал отладку, и ошибка находится в строке

   [plotSpace scaleToFitPlots:[NSArray arrayWithObjects:aaplPlot, googPlot, msftPlot, nil]];

Я думаю, что есть проблема с освобождением объектов, но я точно не знаю, как решить эту проблему. Я получаю сообщение об ошибке, когда метод вызывается во второй раз.

Это метод:

-(void)configurePlots {

    // 1 - Get graph and plot space
    CPTGraph *graph = self.hostView.hostedGraph;
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;
    // 2 - Create the three plots
    CPTScatterPlot *aaplPlot = [[CPTScatterPlot alloc] init];
    aaplPlot.dataSource = self;
    aaplPlot.identifier = CPDTickerSymbolAAPL;
    CPTColor *aaplColor = [CPTColor redColor];
    [graph addPlot:aaplPlot toPlotSpace:plotSpace];
    CPTScatterPlot *googPlot = [[CPTScatterPlot alloc] init];
    googPlot.dataSource = self;
    googPlot.identifier = CPDTickerSymbolGOOG;
    CPTColor *googColor = [CPTColor greenColor];
    [graph addPlot:googPlot toPlotSpace:plotSpace];
    CPTScatterPlot *msftPlot = [[CPTScatterPlot alloc] init];
    msftPlot.dataSource = self;
    msftPlot.identifier = CPDTickerSymbolMSFT;
    CPTColor *msftColor = [CPTColor blueColor];
    [graph addPlot:msftPlot toPlotSpace:plotSpace];
    // 3 - Set up plot space
    // Here is the problem//
    [plotSpace scaleToFitPlots:[NSArray arrayWithObjects:aaplPlot, googPlot, msftPlot, nil]];
    CPTMutablePlotRange *xRange = [plotSpace.xRange mutableCopy];
    [xRange expandRangeByFactor:CPTDecimalFromCGFloat(1.1f)];
    plotSpace.xRange = xRange;
    CPTMutablePlotRange *yRange = [plotSpace.yRange mutableCopy];
    [yRange expandRangeByFactor:CPTDecimalFromCGFloat(1.2f)];
    plotSpace.yRange = yRange;
    // 4 - Create styles and symbols
    CPTMutableLineStyle *aaplLineStyle = [aaplPlot.dataLineStyle mutableCopy];
    aaplLineStyle.lineWidth = 2.5;
    aaplLineStyle.lineColor = aaplColor;
    aaplPlot.dataLineStyle = aaplLineStyle;
    CPTMutableLineStyle *aaplSymbolLineStyle = [CPTMutableLineStyle lineStyle];
    aaplSymbolLineStyle.lineColor = aaplColor;
    CPTPlotSymbol *aaplSymbol = [CPTPlotSymbol ellipsePlotSymbol];
    aaplSymbol.fill = [CPTFill fillWithColor:aaplColor];
    aaplSymbol.lineStyle = aaplSymbolLineStyle;
    aaplSymbol.size = CGSizeMake(6.0f, 6.0f);
    aaplPlot.plotSymbol = aaplSymbol;
    CPTMutableLineStyle *googLineStyle = [googPlot.dataLineStyle mutableCopy];
    googLineStyle.lineWidth = 1.0;
    googLineStyle.lineColor = googColor;
    googPlot.dataLineStyle = googLineStyle;
    CPTMutableLineStyle *googSymbolLineStyle = [CPTMutableLineStyle lineStyle];
    googSymbolLineStyle.lineColor = googColor;
    CPTPlotSymbol *googSymbol = [CPTPlotSymbol starPlotSymbol];
    googSymbol.fill = [CPTFill fillWithColor:googColor];
    googSymbol.lineStyle = googSymbolLineStyle;
    googSymbol.size = CGSizeMake(6.0f, 6.0f);
    googPlot.plotSymbol = googSymbol;
    CPTMutableLineStyle *msftLineStyle = [msftPlot.dataLineStyle mutableCopy];
    msftLineStyle.lineWidth = 2.0;
    msftLineStyle.lineColor = msftColor;
    msftPlot.dataLineStyle = msftLineStyle;
    CPTMutableLineStyle *msftSymbolLineStyle = [CPTMutableLineStyle lineStyle];
    msftSymbolLineStyle.lineColor = msftColor;
    CPTPlotSymbol *msftSymbol = [CPTPlotSymbol diamondPlotSymbol];
    msftSymbol.fill = [CPTFill fillWithColor:msftColor];
    msftSymbol.lineStyle = msftSymbolLineStyle;
    msftSymbol.size = CGSizeMake(6.0f, 6.0f);
    msftPlot.plotSymbol = msftSymbol;
}

Я сделал несколько изменений: я сделал свойства graph, plotSpace, array, aaplPlot, googPlot и msftPlot, а также выделил и инициализировал массив с диаграммами рассеяния.

  array = [[NSArray alloc] initWithObjects:aaplPlot, googPlot, msftPlot, nil];
  [plotSpace scaleToFitPlots:array];

Я получаю ту же ошибку, когда метод вызывается во второй раз.


person uzzi    schedule 10.12.2012    source источник
comment
Убедитесь, что ваши объекты не равны нулю, поскольку вы говорите, что это происходит только при втором запуске. Поставьте точку останова прямо перед сбоем, затем проверьте график и другие объекты. Я верю, что вы найдете ответ после этого. Кроме того, вы используете ARC? Можно предположить, что plotSpace равен нулю, а не новому массиву. Является ли graph.defaultPlotSpace нулевым?   -  person Mark McCorkle    schedule 10.12.2012
comment
NSArray выпускается автоматически, сохраните его.   -  person Ramy Al Zuhouri    schedule 10.12.2012
comment
Ответ значительно облегчит отладку этой проблемы. Мы не можем опубликовать точный ответ без ответа. Вот почему я удалил свой предыдущий ответ...   -  person Mark McCorkle    schedule 10.12.2012


Ответы (2)


CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;

Вышеупомянутый plotSpace находится в методе, попробуйте сделать его статической переменной или свойством класса, чтобы он не освобождался, и проверьте, не является ли он снова init-ed. в случае имущества.

person Anoop Vaidya    schedule 10.12.2012

self.hostView.hostedGraph выпускается. Создайте это как свойство с сохраняемыми или сильными значениями, затем проверьте еще раз. Поскольку это происходит при втором запуске, кажется, что ваш объект освобождается с момента его использования.

@property (nonatomic, strong) CPTGraph *graph;
person Mark McCorkle    schedule 10.12.2012
comment
@giorashc Я бы предположил, что ARC выпустит массив, но убедитесь, что подсчет правильный до следующего оператора, чтобы убедиться, что проблема в этом. - person Mark McCorkle; 10.12.2012
comment
чем вы должны объяснить это в своем ответе. Это больше похоже на предположение, чем на ответ - person giorashc; 10.12.2012
comment
Но массив генерируется на лету, как его проверить? ошибка в той же строке. - person giorashc; 10.12.2012
comment
Установите точку останова сразу после массива NSArray *, чтобы проверить количество - person Mark McCorkle; 10.12.2012
comment
Это все равно не 100% поможет. Вам нужно отладить строку, в которой этот массив используется внутри класса построения. - person giorashc; 10.12.2012
comment
Гиораш, либо предложите свой ответ, либо, пожалуйста, перестаньте говорить, что это не поможет... Вносите свой вклад, а не наказывайте. Установка точки останова сразу после инициализации массива — это то же самое, что вы только что сказали... Поместите точку останова на [пространство графика scaleToFitPlots:array]; Проверьте количество массивов, наведя указатель мыши на массив или набрав po array в консоли. - person Mark McCorkle; 10.12.2012
comment
@MarkM, ваш ответ должен быть комментарием по следующим причинам: вы не знаете, в чем причина проблемы. Вы начали свой ответ со слова «попытаться», которое больше похоже на то, что вы догадываетесь, чем знаете, будет ли оно решено или нет. И я бы ответил, если бы знал, в чем проблема. - person giorashc; 10.12.2012
comment
давайте продолжим это обсуждение в чате - person Mark McCorkle; 10.12.2012
comment
Привет! Извините, что не смог вчера ответить на ваши вопросы, но у меня возникла проблема. Я отлаживал строку, в которой находится массив, и каждый раз считал 3. Я сделал свойства aaplPlot, googPlot, msftPlot, plotSpace, graph и array, но у меня та же проблема. При первом вызове метода переменные aaplPlot, googPlot, msftPlot имеют одни значения, а при втором — другие значения. - person uzzi; 11.12.2012
comment
@MarkM, когда код дает сбой в этой строке, ничего не кажется нулевым. :) само BrowserViewController * 0x1107cbc0 msftColor CPTColor * 0x11043f70 aaplPlot CPTScatterPlot * 0x110969a0 массив __NSArrayI * 0x0852e250 googPlot CPTScatterPlot * 0x11096b80 граф CPTXYGraph * 0x110943c0 msftPlot CPTScatterPlot * 0x11096d10 plotSpace CPTXYPlotSpace * 0x11093db0 CPDTickerSymbolMSFT NSString * сопзЬ 0x000ccbbc - person uzzi; 11.12.2012
comment
Попробуйте включить NSZombie и посмотрите, сможете ли вы получить более подробный отчет о сбое. Перейдите на вкладку «Диагностика» вашей текущей схемы и включите «Включить объекты-зомби». Это должно показать вам, в какой момент что-то падает, и должно прояснить ситуацию. - person Mark McCorkle; 12.12.2012