1

所以,我试图通过破坏一个 NSString 来构建一个 CGPoints 数组,通常看起来像这样:

31.241854,34.788867;31.241716,34.788744;31.242547,34.787585;31.242661,34.787719

使用此代码:

- (NSMutableArray *)buildPolygon:(NSString *)polygon
{
    NSMutableArray *stringArray = [[NSMutableArray alloc] init];
    [stringArray addObject:[polygon componentsSeparatedByString:@";"]];
    NSMutableArray *polygonArray = [[NSMutableArray alloc] init];

    for (int i=0; i < polygonArray.count; i++)
    {
        NSArray *polygonStringArray = [[NSArray alloc] init];
        polygonStringArray = [[stringArray objectAtIndex:i] componentsSeparatedByString:@","];
        CGFloat xCord = [[polygonStringArray objectAtIndex:0] floatValue];
        CGFloat yCord = [[polygonStringArray objectAtIndex:1] floatValue];
        CGPoint point = CGPointMake(xCord, yCord);
        [polygonArray addObject:[NSValue valueWithCGPoint:point]];
    }

    NSLog(@"return polygonArray: %@", polygonArray);
    return polygonArray;
}

但最终我得到一个空数组。我做错了什么?

4

2 回答 2

3

您在polygonArrayfor 循环开始之前将其定义为一个空数组。您应该定义polygonArray如下:

NSArray *polygonArray = [polygon componentsSeparatedByString:@";"];

你甚至不需要为那个stringArray变量而烦恼。

于 2013-06-13T20:45:37.040 回答
1

您对alloc&感到困惑init,还有一个简单的错字...

首先是困惑:

NSMutableArray *stringArray = [[NSMutableArray alloc] init];

这将创建一个新NSMutableArray的并将对它的引用存储在stringArray. 到目前为止一切都很好。

[stringArray addObject:[polygon componentsSeparatedByString:@";"]];

这将获得对NSArray( [polygon componentsSeparatedByString:@";"]) 的引用,并将其作为单个元素添加到由 引用的可变数组中stringArray这本身并没有错,但在这种情况下它不是你想要的——你只想要componentsSeparatedByString:. 你这样做:

NSArray *stringArray = [polygon componentsSeparatedByString:@";"];

它获取由返回的引用componentsSeparatedByString:并将其存储在变量中stringArray- 不需要allocinit不需要,因为您不是自己创建数组。你甚至不拥有这个数组,所以如果你使用的是 MRC,以后就不需要release它了。

NSArray *polygonStringArray = [[NSArray alloc] init];

现在这分配了一个不可变的空数组并将对它的引用存储在polygonStringArray. 这不是一个非常有用的数组,因为它不包含任何内容且无法修改!但你不会长时间保持它...

polygonStringArray = [[stringArray objectAtIndex:i] componentsSeparatedByString:@","];

这从 中获取对数组的引用componentsSeparatedByString:并将其存储在polygonStringArray. 如果您使用的是 MRC,这将导致泄漏- 您在上面创建的无意义的零长度数组将泄漏,并且每次循环时都会创建并泄漏一个新的零长度数组。

你对分配感到困惑——你只需要分配你正在创建的东西;当您收到对已分配对象的引用时,您只需要存储该引用。(如果使用 MRC,您可能还需要保留/释放/自动释放它 - 但让我们坚持使用 ARC。)所以您需要的只是:

NSArray *polygonStringArray = [[stringArray objectAtIndex:i] componentsSeparatedByString:@","];

现在您的代码几乎是正确的,只有一个错字:

for (int i=0; i < polygonArray.count; i++)

好吧,你正在填写polygonArray这个循环,它开始时是空的,你需要的是stringArray.count.

高温高压

于 2013-06-13T21:11:10.527 回答