nsnumber内存管理

时间:2011-06-29 11:24:40

标签: iphone cocoa-touch

这个代码是否正确管理nsnumber?我不确定这个部分的数量不止一次: 顺便说一句,这段代码不起作用,我没有看到maxCount和maxRate外块。通常吗?通常我在代码的其他部分看到它。

maxCount = [NSNumber numberWithInt:[count intValue]]; 

__block NSNumber *maxCount = nil;
__block NSNumber *maxRate = nil;
// winned must have less rate in same count issues 
[rates enumerateKeysAndObjectsWithOptions:NSSortStable usingBlock:^(NSNumber *rateFromRatesList, NSNumber *count, BOOL *stop) {
        NSLog (@"%@/%@ have rateFromRatesList:%@, count:%@, maxCount:%@, maxRate:%@",currentDestination.country,currentDestination.specific,rateFromRatesList,count,maxCount,maxRate);
        if ([maxCount intValue] <= [count intValue]) { 
            if ([maxCount intValue] == [count intValue]) {

             // we are update destination rate only if we find rate less than maxrate
              if ([maxRate doubleValue] > [rateFromRatesList doubleValue]) {
                   maxCount = [NSNumber numberWithInt:[count intValue]]; 
                   maxRate = [NSNumber numberWithDouble:[rateFromRatesList doubleValue]];
              }
            } else {
               // in oother case, just update to max count
               maxCount = [NSNumber numberWithInt:[count intValue]]; 
               maxRate = [NSNumber numberWithDouble:[rateFromRatesList doubleValue]];
            }                                 
      }
}];

这部分代码工作正常(是enumerateusingblock中的错误吗?:

                    int maxCount = 0;
                    double maxRate = 0;
                    // winned must have less rate in same count issues 
                    //[rates enumerateKeysAndObjectsUsingBlock:^(NSNumber *rateFromRatesList, NSNumber *count, BOOL *stop) {

                    for (NSNumber *rateFromRatesList in [rates allKeys]) {
                        NSNumber *count = [rates objectForKey:rateFromRatesList];
                        NSLog (@"%@/%@ have rateFromRatesList:%@, count:%@, maxCount:%@, maxRate:%@",currentDestination.country,currentDestination.specific,rateFromRatesList,count,[NSNumber numberWithInt:maxCount],[NSNumber numberWithDouble:maxRate]);
                        if (maxCount <= [count intValue]) { 
                            if (maxCount == [count intValue]) {

                                // we are update destination rate only if we find rate less than maxrate
                                if (maxRate > [rateFromRatesList doubleValue]) {
                                    maxCount = [count intValue]; 
                                    maxRate = [rateFromRatesList doubleValue];
                                }
                            } else {
                                // in oother case, just update to max count
                                maxCount = [count intValue]; 
                                maxRate = [rateFromRatesList doubleValue];
                            }

                        }
                    };

3 个答案:

答案 0 :(得分:0)

在:

maxCount = [NSNumber numberWithInt:[count intValue]];

您的NSNumber是自动释放的,并会在稍后的某个时间点自动释放。因此,当您再次分配给maxCount时,您没有任何泄漏。

maxCount = [NSNumber numberWithInt:[count intValue]];

如果您使用[[... alloc] initWith ...],这会有所不同,因为在这种情况下,您获得的对象将被保留,您将负责释放它们,然后再次分配给指向它们的变量

答案 1 :(得分:0)

我不认为你是在泄漏记忆,因为它们是自动释放的物体,所以你在这方面很好。但是,您可以直接执行此操作,而不是创建新的自动释放对象 -

maxCount = count;

替代方法

我认为你应该能够实现你想要用这两行做的事情。

NSNumber * maxCount = [[rates allValues] valueForKeyPath:@"@max.intValue"];
NSNumber * maxRate = [[rates allKeysForObject:maxCount] valueForKeyPath:@"@max.doubleValue"];
  1. 第一行获得您拥有的所有计数的最大值。
  2. 第二个检索具有最大计数的密钥并检索最大速率。

答案 2 :(得分:0)

我可能错了,但您要将自动释放的对象分配给count和maxCount。它们不应该被保留或复制吗?

您的代码不会泄漏,但在完成阻止后,NSNumber对象应该很快被解除分配。