2013-03-30 2 views
-5

Я хочу иметь массив со значениями «25 кг», «26 кг» ... «149 кг», «150 кг». Чтобы упростить задачу, я написал:Невозможно создать NSMutableArray с использованием for-loop

-(NSMutableArray*)weightArray{ 

    NSMutableArray *myArray; 
    for (int i=25; i++; i<150){ 
     NSString *weightString; 
     weightString = [NSString stringWithFormat:@"%d kg", i]; 
     [myArray addObject:weightString]; 
    } 
    return myArray; 
} 

А потом в viewDidload на мой взгляд, я писал: NSLog (@"%@", [self weightArray]); Но, похоже, это не работает. Я мог бы пропустить что-то очевидное, как синтаксис. Почему это не работает?

UPDATE: Наконец я нашел решение - первый, я декларировать weightArray в @implementation разделе, то я писал:

-(void)fillingArray{ 

    if (!weightArray){ 
     for (int i=25; i<150 ;i++){ 
      NSString *weightString = [[NSMutableArray alloc] init]; 
      weightString = [NSString stringWithFormat:@"%d kg", i]; 
      [weightArray addObject:weightString]; 
      NSLog(@"%@", weightString); 
     } 
    } 

} 

В viewDidLoad я писал:

[self fillingArray]; 
NSLog(@"%@", weightArray); 

Я думаю, мой проблема была в этой строке NSLog (@ "% @", [self weightArray]); В квадратных скобках это должно быть имя метода, но я пытался указать на массив, и ничего не происходит.

+3

Вам необходимо создать свой массив. – DrummerB

+0

Плохая форма, чтобы изменить ваш вопрос (особенно код) со временем. Это аннулирует полученные ответы. Если что-нибудь, добавьте обновление в конец вашего вопроса. – rmaddy

+0

Почему люди голосуют, чтобы закрыть этот вопрос? Это совершенно правильный вопрос, на который можно ответить в его текущей форме. – rmaddy

ответ

7

Есть 3 проблемы с тем, что вы делаете.

  1. Вам необходимо создать свой массив следующим образом: NSMutableArray *myArray = [[NSMutableArray alloc] init];, чтобы он действительно существовал.
  2. Ваш NSLog должен быть NSLog (@"%@", [self weightArray]);, так как вы lgging массив, а не число.
  3. (спасибо rmaddy за указание этого) 2-я и 3-я части вашего for заявления отменены. Итак, i++ - это ваше условие и всегда отличное от нуля. Этот бесконечный цикл заставляет ваш компьютер блокироваться.

EDIT: Вот лучший способ создания массива только один раз.

-(NSMutableArray*)weightArray{ 

    static NSMutableArray *myArray; 
    if (!myArray){ 
     myArray = [[NSMutableArray alloc] init]; 
     for (int i=25; i<150 ;i++){ 
      NSString *weightString; 
      weightString = [NSString stringWithFormat:@"%d kg", i]; 
      [myArray addObject:weightString]; 
     } 
    } 
    return myArray; 
} 
+0

Я вижу, что вы изменили свой вопрос, чтобы обратиться ко второму вопросу. –

+2

Я также вижу еще одну проблему с этим подходом: 3. Этот массив создается каждый раз, когда этот метод вызывается ... может быть дорогостоящим процессором. Почему бы не создать этот массив в 'init' вместо этого и назначить ivar или свойство? –

+0

Хороший комментарий. Сделал EDIT для решения вашей проблемы. –

2

Вы не выделяете и не инициализируете массив. Таким образом, он имеет неопределенное значение, и ваша программа вызывает неопределенный beahvior. Создайте его на самом деле:

NSMutableArray *myArray = [NSMutableArray new]; 
+0

Спасибо, но мне становится хуже, когда я выделяю его с помощью [[NSMutableArray alloc] init], теперь он никогда не загружает экран и не замораживает весь Mac, странно .. –

+1

Это не проблема управления памятью. См. Часть 3 моего ответа. -Cheers. –

Смежные вопросы