【问题标题】:Core-Plot: App Crashes if plot points are passed as NSArray of numbers in iPhone SDKCore-Plot:如果绘图点作为 iPhone SDK 中的 NSArray 数字传递,则应用程序崩溃
【发布时间】:2011-02-17 06:16:42
【问题描述】:

在我的 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];
    }
  }

【问题讨论】:

  • 我不知道你期望什么,但除了丑陋的代码和泄漏之外,这段代码没有任何问题。该代码完全符合我的想法。在其他位置查找您的错误。

标签: iphone cocoa-touch nsarray core-plot


【解决方案1】:

在谈论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]];
        }
    }
}

即使在检查 plotData 为零之前,您也有两个 NSArray 正在泄漏。我已经删除了它们,它们的功能被注释掉的代码替换,您列出的值被手动添加到 plotData 数组中。如果您反复调用-generateData,这些泄漏可能会导致内存不足崩溃。

然后,我简化了 for 循环,以便用一些值填充 plotData 数组。此处无需使用 NSMutableDictionary(即使您粘贴此行的 Core Plot 示例应用程序使用了 NSMutableDictionary)。

要在 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 的数据,而在于您的应用程序的其他地方。与往常一样,启用异常断点,打开断点运行,并查看应用程序崩溃的确切位置。读取堆栈跟踪。

【讨论】:

    【解决方案2】:

    找到解决方案。

    因为它把数组值当作字符串,所以我参考了这个链接

    iphone, using an array to define in core-plot range

    这解决了我的问题。

    感谢布拉德·拉森的帮助。继续努力。!!

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多