在Objective-C中重用变量是否可以?

时间:2015-01-09 18:16:59

标签: objective-c variables memory

请注意以下两种方法中Category变量的使用方式。我认为方法1不会很好,因为每个循环都会创建一个新的变量实例,那么为什么我会看到使用这种策略的代码示例呢?我认为方法2会更好,因为它会占用更少的内存。

方法1

NSData * data = [NSData dataWithContentsOfURL:url];  
json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

for (int i=0; i < json.count; i++)
{
    NSString * Category = [[json objectAtIndex:i] objectForKey:@"CategoryID"]; 

    //do something here
}

方法2

NSURL * url = [NSURL URLWithString:getDataURL];
NSData * data = [NSData dataWithContentsOfURL:url];  
json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

NSString * Category 
for (int i=0; i < json.count; i++)
{
    Category = [[json objectAtIndex:i] objectForKey:@"CategoryID"];

    //do something here
}

3 个答案:

答案 0 :(得分:3)

这两种方法在功能上是相同的。你在第二个中所做的就是给变量一个更宽的范围(在第一个版本中,范围仅限于循环)。

出于这个原因,您应该更喜欢第一个版本,因为范围应该尽可能地受到限制。

每次仍会创建一个新值。你将变量声明与变量赋值混淆了。

答案 1 :(得分:2)

你的第一个例子是更好的方法。创建变量声明没有成本。如果不需要,编译器将对其进行优化。重用变量是错误的常见来源,通常应该避免。

重用对象是完全不同的事情,有时对性能非常重要。但是Category不是一个对象,它只是一个指向对象的指针。 (请注意,变量应始终具有前导小写。前导大写表示它是一个类。)

即便如此,这仍然不是最佳方式。您应该尽可能避免objectAtIndex:,而是使用枚举。这更安全,更清晰,更有效率。

NSData * data = [NSData dataWithContentsOfURL:url];  
NSArray *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
// You really should validate that json is an array and check for errors. 

for (NSString *category in [json valueForKey:@"CategoryID"])
{
    //do something here
}

这通过使用KVC方法[NSArray valueForKey:]来工作,该方法返回给定属性的新数组。也就是说,如果你从外部来源拉动,你需要非常小心。如果您收到格式错误的数据,那么您将崩溃。你需要确保达到预期目的。

答案 2 :(得分:1)

在堆栈上创建局部变量。当您进入范围时,堆栈指针将被移动以为变量腾出空间。然后,当您离开范围时,该变量的空间将从堆栈顶部弹出。

当你在谈论一个指向对象的变量时,我们讨论的是4或8个字节(32位设备为4,64位设备为8)。内存量很小。

在第一个示例中,堆栈指针被移动以在{{1}的开头为Category变量(应该是小写,category以遵循Cocoa命名约定btw)腾出空间。循环,然后一旦循环完成执行就丢弃内存。内存永远不会浪费,只是暂时使用。

说“......每个循环都创建一个新的变量实例”是不正确的。变量在进入循环之前创建并在之后丢弃。

在第二个示例中,变量是在方法的范围内定义的。因此,4(或8)字节一直存在,直到方法完成。但是,一旦方法完成,无论如何都会恢复内存。

除非您有堆栈溢出,否则局部变量不是有意义的内存使用者。 iOS设备有几百兆内存,可能是几千兆字节。这是数亿字节,甚至数十亿字节。担心单个指针局部变量就像比尔盖茨担心口袋变化一样。我曾经读过有人计算过,当盖茨担任微软首席执行官时,如果他在街上看到100美元的钞票,那么花费几秒钟弯腰捡起它就不太经济有效地利用他的时间。他会花更多的钱再花几秒钟做他的工作。担心指针变量的空间就像盖茨担心少花一美元的钞票(一美元钞票,他会在几分之一秒后回来!)