2013-06-13 5 views
1

Итак, я пытаюсь создать массив CGPoints разбив в NSString, как правило, выглядит следующим образом:Попытка построить многоугольник из NSString

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; 
} 

Но в конечном итоге я получаю пустой массив. Что я делаю неправильно?

+0

Вы проверили все промежуточные этапы, т.е. что ранее массивы являются действительными и то, что вы ожидаете? Например, что такое '[stringArray objectAtIndex: 1]'? (Подсказка: вы только положили туда один объект.) Каковы возможные значения 'i'? –

+0

Перед тем как 'если' я был журнал, а сюжет был:. ( ( "31.241854,34.788867", "31.241716,34.788744", "31.242547,34.787585", "31.242661,34.787719" ) Среднее это было нормально, но «polygonArray» пуст. –

ответ

3

Вы определяете polygonArray как пустой массив непосредственно перед началом цикла for. Вы должны определить, как polygonArray:

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

И вам даже не нужно возиться с этой stringArray переменной.

+0

Извините, что это неправильно, 'polygonArray' объявлен правильно, это массив результатов ... Вы были введены в заблуждение опечаткой в ​​цикле' for'. – CRD

+0

Ваш ответ Спасибо, я исправлю свой код. –

1

Вы путаницу alloc & init и один простой опечатка ...

В неразберихи первых:

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

Это создает новый NSMutableArray и сохраняет ссылку на него в stringArray. Все хорошо до сих пор.

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

И это получает ссылку на NSArray ([polygon componentsSeparatedByString:@";"]) и добавляет его в качестве единственного элемента к изменяемым массива, на который ссылается stringArray. Нет ничего плохого per se с этим, но это не что вы хотите в этом случае - вам просто нужен массив, возвращаемый componentsSeparatedByString:. Вы можете сделать это с:

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

Который берет ссылку возвращенное componentsSeparatedByString: и сохраняет его в переменной stringArray - не alloc или init требуется, как вы не создание массива себя. Вы даже не собственный этот массив, поэтому, если вы используете 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.

НТН