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あり、単純なタイプミスが 1 つあります...

最初の混乱:

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

これにより、新しい が作成NSMutableArrayされ、それへの参照が に保存されstringArrayます。これまでのところすべて順調です。

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

NSArrayそして、これは( )への参照を取得し、それを単一の要素として、によって参照される可変配列に[polygon componentsSeparatedByString:@";"]追加します。これ自体は何も問題はありません、この場合は必要ありません。 によって返される配列が必要なだけです。これを行うには:stringArraycomponentsSeparatedByString:

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

によって返された参照を受け取り、componentsSeparatedByString:それを変数に格納しますstringArray-配列を自分で作成していないため、いいえallocまたはinit必須です。この配列を所有していないため、MRC を使用している場合は、release後でそれを使用する必要はありません。

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

これで、不変の空の配列が割り当てられ、それへの参照が に格納されpolygonStringArrayます。これはあまり有用な配列ではありません。何も含まれておらず、変更できないからです。しかし、あなたはそれを長く維持しません...

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

これは、 から配列への参照を取得し、componentsSeparatedByString:に格納しpolygonStringArrayます。MRC を使用している場合、これによりリークが発生します。上で作成した意味のない長さ 0 の配列がリークし、新しい長さ 0 の配列が作成され、ループのたびにリークされます。

割り当てについて混乱しています。作成しているものを割り当てるだけで済みます。すでに割り当てられているオブジェクトへの参照を受け取った場合、その参照を保存するだけで済みます。(MRC を使用している場合は、保持/解放/自動解放も必要になる場合がありますが、ARC に固執しましょう。) したがって、ここで必要なのは次のとおりです。

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

これで、コードはほぼ正しいものになりました。タイプミスが 1 つだけです。

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

さて、あなたはpolygonArrayこのループを埋めていて、それは空として始まります。必要なのはstringArray.count.

HTH

于 2013-06-13T21:11:10.527 に答える