Как управлять int, когда он увеличивается внутри другого цикла? - PullRequest
2 голосов
/ 17 января 2011

У меня есть простой цикл со счетчиком int, который увеличивается в цикле while, когда существует особый случай. Мой вопрос прост - как мне управлять памятью внутри этой функции, особенно в отношении int? Я почти исключительно использую NSNumber, и то небольшое время, которое я провел с int, похоже, заставляет меня думать, что я не делаю его правильно.

Любые другие улучшения также приветствуются, но меня очень интересует вопрос int

- (NSArray *)parseJson:(NSArray *) items
{
  NSMutableArray* hats = [[NSMutableArray alloc] init];
  NSEnumerator *enumerator = [items objectEnumerator];
  NSDictionary* item;
  int counterz = 0;
  while (item = (NSDictionary*)[enumerator nextObject]) {
    Hat* hat = [[Hat alloc] init];

    hat.addr = [item objectForKey:@"Address"];

    BOOL* hasHat = [item objectForKey:@"HasHat"];

    if ([hasHat boolValue]) {
      if (counterz < 10) {
        [hats addObject:hat];
        counterz++;
      }
    }
  }

  return hats;
}

Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 17 января 2011

Вам не нужно выпускать «обычный» (то есть не основанный на объектах) int - он будет счастливо прожить свою (короткую, трагическую) жизнь в стеке, пока не выпадет из области видимости.

3 голосов
/ 17 января 2011

У вас есть пара ненужных вещей и утечки памяти ...

- (NSArray *)parseJson:(NSArray *) items {
  NSMutableArray *hats = [NSMutableArray array];
  int counter = 0;
  for (NSDictionary *item in items) {
    Hat *hat = [[Hat alloc] init];
    [hat setAddr:[item objectForKey:@"Address"]];
    BOOL hasHat = [[item objectForKey:@"HasHat"] boolValue];
    if (hasHat && counter < 10) {
      [hats addObject:hat];
      counter++;
    }
    [hat release];
  }
  return hats;
}

И, черт возьми, как только вы достигнете counter из 10, вы можете break выйти из цикла, потому что вы никогда не будете делать ничего полезного, когда достигнете 10.

Некоторые другие комментарии:

  • Название метода неверно. Ничего об этом методе не имеет отношения к парсингу JSON. В лучшем случае вы интерпретируете массив словарей, которые произошли с и происходят из строки JSON, но нет ничего о природе этого кода, который говорит: «это анализ JSON».
  • -[NSDictionary objectForKey:] возвращает объект. BOOL - это не объект, это примитив (например, int или char). Добавление * к типу также не делает его объектом. :)
  • Поскольку имя метода не начинается с new или alloc и не содержит слова copy, вы должны вернуть из него объект, выпущенный автоматически. Метод в вопросе возвращал принадлежащий объект (+1 сохраняет счет), так как вы вызвали alloc, но никогда autorelease. Использование удобного конструктора +array исправляет это.
  • В вашем цикле вы выделили объект Hat, но никогда не освобождали его. Это классическая утечка памяти.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...