我有一个带有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;
}
提前谢谢!
答案 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,你永远不会做任何有用的事情。
其他一些评论:
-[NSDictionary objectForKey:]
返回一个对象。 BOOL
不是对象,它是原语(如int
或char
)。将*
附加到该类型也不会使其成为对象。 :)new
或alloc
开头且不包含单词copy
,因此您应该从中返回自动释放的对象。问题中的方法是返回一个拥有的对象(+1保留计数),因为您调用了alloc
,但从未autorelease
。使用便利构造函数+array
修复此问题。Hat
对象,但从未发布过它。这是一个典型的内存泄漏。