目标 c 泄漏 NSNumber 被保留

Posted

技术标签:

【中文标题】目标 c 泄漏 NSNumber 被保留【英文标题】:objective c leaking NSNumber being retained 【发布时间】:2011-06-02 03:22:22 【问题描述】:

我的应用程序使用 GPS 并在每次更新 GPS 时分配一个 NSNumber 实例变量,并且在发布前的最后一点测试中,我发现它泄漏了很多。我相当确定我知道哪些线路导致了泄漏,但我不知道如何解决它。

latitude = [[NSNumber numberWithFloat:[[coordinates objectAtIndex:0] floatValue]] retain];

这条线在我的 GPS 更新方法中,并定期运行。纬度是一个实例变量,当我删除保留时,我无法再在我需要的其他方法中访问该变量。我在 dealloc 方法中释放了变量,但这似乎没有任何作用。

我了解 alloc-release 范例,但我仍然不确定如何解决此问题。

【问题讨论】:

【参考方案1】:

在设置之前,必须释放之前保留的值。否则,当您分配新指针时,先前释放的对象没有引用它,并且永远无法释放。

为了轻松做到这一点,我建议将其设置为@property 并使用self.latitude = [NSNumber numberWithFloat:[[coordinates objectAtIndex:0] floatValue]];。请注意,在分配中不再使用保留。这是假设您的属性设置了 retain 标志,并为您保留。

@property (nonatomic, retain) NSNumber *latitude

【讨论】:

【参考方案2】:

如果没有看到你的代码的其余部分,很难准确地说出你应该如何解决这个问题,但一个好的第一种方法可能是尝试自动释放它:

latitude = [[NSNumber numberWithFloat:[[coordinates objectAtIndex:0] floatValue]] autorelease];

要考虑的另一件事是将纬度设为@property 并将其设置为保留。这样,当你设置它时,它会释放之前的值。同样,在不知道您如何使用纬度的情况下,很难为您指明一个可靠的方向。

【讨论】:

向该对象发送-autorelease 可能会使其在其他方法中不可用。

以上是关于目标 c 泄漏 NSNumber 被保留的主要内容,如果未能解决你的问题,请参考以下文章

对包含 NSNumber 变量的 NSobjects 的 NSArray 进行排序

NSNumber doubleValue 方法在目标 C (IOS) 中返回 null

在 Objective-C 中将货币字符串转换为浮点数

Objective C:switch inside loop - 如何避免(潜在的)内存泄漏

无法将 Float 类型的值转换为预期的参数类型 NSNumber

目标c:检查整数/整数/数字