当它在另一个循环中递增时如何管理int?

时间:2011-01-17 16:31:43

标签: objective-c memory-management int

我有一个带有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 个答案:

答案 0 :(得分:6)

你不需要释放一个“普通”(即:非基于对象)int - 它会幸运地在堆栈上(短暂的,悲惨的)生活,直到它超出范围

答案 1 :(得分:3)

你有一些不必要的东西和一些内存泄漏......

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

哎呀,一旦达到10 counter,你就可以break离开循环,因为一旦达到10,你永远不会做任何有用的事情。

其他一些评论:

  • 方法的名称是错误的。此方法的任何内容都与解析 JSON无关。最好的解释是从JSON字符串中解释发生在发起的字典数组,但是这个代码的本质并没有说“这是解析JSON”。
  • -[NSDictionary objectForKey:]返回一个对象。 BOOL不是对象,它是原语(如intchar)。将*附加到该类型也不会使其成为对象。 :)
  • 由于方法名称不以newalloc开头且不包含单词copy,因此您应该从中返回自动释放的对象。问题中的方法是返回一个拥有的对象(+1保留计数),因为您调用了alloc,但从未autorelease。使用便利构造函数+array修复此问题。
  • 在循环中,您分配了一个Hat对象,但从未发布过它。这是一个典型的内存泄漏。