Core-Plot: приложение вылетает, если точки графика передаются как NSArray чисел в iPhone SDK - PullRequest
0 голосов
/ 17 февраля 2011

В моем приложении для iPhone я добавил основной график.

Работает нормально, если я случайно создаю значения через цикл for (закомментированные строки в коде ниже)

Когда я пытаюсь передать массив значений в качестве точек графика, приложение вылетает.

Что может быть не так?

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

Ниже приведен код, в который передаются значения массива

Код:

- (void)generateData

  {

     NSArray *A = [[NSArray alloc] initWithObjects:@"1000",@"2000",@"1100",@"4000",nil];

     NSArray *B = [[NSArray alloc] initWithObjects:@"1100",@"2200",@"3300",@"4400",nil];

     if (plotData == nil)
     {

           NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100];

           for (NSUInteger i = 0; i < 4; i++) 
           {

                id x = (NSNumber *)[NSNumber numberWithUnsignedInteger:[[A objectAtIndex:i] intValue]];
                id y = (NSNumber *)[NSNumber numberWithUnsignedInteger:[[B objectAtIndex:i] intValue]];
               // id x = [NSDecimalNumber numberWithDouble:1.0 + i * 0.05];
              // id y = [NSDecimalNumber numberWithDouble:1.2 * rand()/(double)RAND_MAX + 0.5];

               [contentArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:x, @"x", y, @"y", nil]];
           }

           plotData = [contentArray retain];
    }
  }

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Прежде чем говорить о Core Plot, давайте очистим код, который вы разместили:

- (void)generateData
{
    if (plotData == nil)
    {        
        plotData = [[NSMutableArray alloc] initWithCapacity:100];

        // Manually specifying values
//        [plotData addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1000], @"x", [NSNumber numberWithInt:1100], @"y", nil]];
//        [plotData addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:2000], @"x", [NSNumber numberWithInt:2200], @"y", nil]];
//        [plotData addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1100], @"x", [NSNumber numberWithInt:3300], @"y", nil]];
//        [plotData addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:4000], @"x", [NSNumber numberWithInt:4400], @"y", nil]];

        // Looping for values
        for (NSUInteger currentValueIndex = 0; currentValueIndex < 4; currentValueIndex++) 
        {
            [plotData addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1000 * currentValueIndex], @"x", [NSNumber numberWithInt:1000 * currentValueIndex], @"y", nil]];
        }
    }
}

У вас есть два NSArrays, которые вы пропускаете, даже до того, как проверка на plotData будет равна нулю.Я удалил их с заменой их функции закомментированным кодом, в котором перечисленные вами значения вручную добавляются в массив plotData.Эти утечки потенциально могут привести к сбою нехватки памяти, если вы неоднократно вызывали -generateData.

. Затем я упростил цикл for для заполнения массива plotData некоторыми значениями.Здесь нет необходимости использовать NSMutableDictionary (даже если пример приложения Core Plot, из которого вы вставили эту строку, использует один).

Чтобы использовать это в Core Plot, вам необходимо убедиться, что методы делегата источника данных необходимывыглядят следующим образом:

-(NSUInteger)numberOfRecordsForPlot:(CPPlot *)plot 
{
    return [plotData count];
}

-(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 
{
    return [[plotData objectAtIndex:index] valueForKey:(fieldEnum == CPScatterPlotFieldX ? @"x" : @"y")];
}

Если ваше приложение все еще дает сбой с этими исправлениями, ваша проблема не в данных, которые вы предоставляете в Core Plot, а в других местах вашего приложения.Как всегда, включите точки останова для исключений, запустите с точками останова и посмотрите, на какой именно линии вылетает ваше приложение.Прочитайте следы стека.

0 голосов
/ 18 февраля 2011

Получил решение.

Это было потому, что он обрабатывал значения массива как строки, поэтому я ссылался на эту ссылку

iphone, используя массив для определения в диапазоне основного графика

и это решило мою проблему.

Спасибо Брэду Ларсону за вашу помощь. Продолжайте в том же духе. !!

Надеюсь, это кому-нибудь поможет.

...