首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nsnumber内存管理

nsnumber内存管理
EN

Stack Overflow用户
提问于 2011-06-29 19:24:40
回答 3查看 197关注 0票数 0

管理nsnumber的代码正确吗?在这一部分中,我不能多次确定数字集:顺便说一句,这段代码不能工作,我没有在代码块外看到maxCount和maxRate。这是正常的吗?通常我会在代码的其他部分看到它。

代码语言:javascript
复制
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]];
            }                                 
      }
}];

这部分代码工作正常(是枚举块中的bug吗?:

代码语言:javascript
复制
                    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];
                            }

                        }
                    };
EN

回答 3

Stack Overflow用户

发布于 2011-06-29 19:34:16

在:

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

您的NSNumber将自动释放,并将在稍后的某个时间点自动释放。所以当你再次赋值给maxCount时,你不会有任何泄漏。

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

如果您使用[...alloc ...]因为在这种情况下,您获得的对象将被保留,并且您需要负责在将它们再次赋值给指向它们的变量之前释放它们。

票数 0
EN

Stack Overflow用户

发布于 2011-06-29 19:35:00

我不认为你是在泄露内存,因为它们是自动释放的对象,所以你在这方面很好。但是,您可以直接执行以下操作,而不是创建新的自动发布对象-

代码语言:javascript
复制
maxCount = count;

另一种方法

我认为您应该能够实现您尝试使用这两行代码所要做的事情。

代码语言:javascript
复制
NSNumber * maxCount = [[rates allValues] valueForKeyPath:@"@max.intValue"];
NSNumber * maxRate = [[rates allKeysForObject:maxCount] valueForKeyPath:@"@max.doubleValue"];

  1. 第一行获取所有计数的最大值。
  2. 第二行检索具有最大计数的密钥并检索最大速率。
票数 0
EN

Stack Overflow用户

发布于 2011-06-29 19:41:41

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

您的代码不会泄漏,但是在完成代码块之后,NSNumber对象应该很快就会被释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6519850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档