ios - 在具有 ARC 启用项目的仪器中的 [[NSNumberFormatter alloc] init] 中出现内存泄漏

标签 ios objective-c memory-leaks

在我的项目中的 NSNumberFormatter 上发生有线内存泄漏。

当我在 Instrument 中检查我的应用程序时,我遇到了许多框架泄漏,其中一个非常令人惊讶的泄漏是 NSNumberFormatter 在我分配该格式化程序对象时发生泄漏。

这是我格式化 Number 值的函数:

//Set Number Formatter - Like 1000 = 1,000
+ (NSString *)getNumberWithNumberFormate:(NSString*)dataVal{
    NSNumberFormatter *aNumberFormatter = [[NSNumberFormatter alloc] init];
    [aNumberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
    NSString *aFormattedNumber = [aNumberFormatter stringFromNumber:[NSNumber numberWithDouble:[dataVal doubleValue]]];
    aNumberFormatter = nil;
    return aFormattedNumber;
}

当我检查内存泄漏时,它会显示

NSNumberFormatter *aNumberFormatter = [[NSNumberFormatter alloc] init];

这条线是泄漏。

格式化完成后,我也nil这个对象。

aNumberFormatter = nil;

仍然存在内存泄漏。

任何解决此泄漏的想法。

查看此仪器屏幕截图。 enter image description here

最佳答案

因此,对于您的情况,您无需将实例设置为 nil aNumberFormatter = nil getNumberWithNumberFormate 类方法超出范围后,NSNumberFormatter 的实例将被销毁。 尝试稍微修改一下你的方法

+ (NSString *)getNumberWithNumberFormate:(NSString*)dataVal{
    NSNumberFormatter *aNumberFormatter = [[NSNumberFormatter alloc] init];
    [aNumberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
    NSString *aFormattedNumber = [aNumberFormatter stringFromNumber:[NSNumber numberWithDouble:[dataVal doubleValue]]];
    return aFormattedNumber;
}

此外,好的做法是使用 static 实例和 dispatch_once 作为格式化程序,如下所示

+ (NSString *)getNumberWithNumberFormate:(NSString*)dataVal{
    static NSNumberFormatter *aNumberFormatter = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        aNumberFormatter = [[NSNumberFormatter alloc] init];
        [aNumberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
    });
    NSString *aFormattedNumber = [aNumberFormatter stringFromNumber:[NSNumber numberWithDouble:[dataVal doubleValue]]];
    return aFormattedNumber;
}

在此示例中,每次使用此类方法时仅使用一个实例,从而减少内存使用量

回答评论并清除调试尝试检查此代码

+ (NSString *)getNumberWithNumberFormate:(NSString*)dataVal{
    NSString *copyDataValue = [dataVal copy];
    double dataValueDouble = [copyDataValue doubleValue];
    static NSNumberFormatter *aNumberFormatter = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        aNumberFormatter = [[NSNumberFormatter alloc] init];
        [aNumberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
    });
    NSString *aFormattedNumber = [aNumberFormatter stringFromNumber:@(dataValueDouble)];
    return aFormattedNumber;
}

关于ios - 在具有 ARC 启用项目的仪器中的 [[NSNumberFormatter alloc] init] 中出现内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39409468/

相关文章:

iOS:通过 URL Scheme 将图像和 url 固定到 Pinterest 应用程序

c# - Xamarin App 仅在 Debug模式下崩溃

objective-c - 将外部库添加到 XCode 4.3 中的项目

ios - 使用 use_frameworks 时 react-native-maps iOS 构建问题! :linkage => :static

python - 我需要使用 django reset_queries()

memory-leaks - 取消分配 Fortran 派生类型是否也会自动取消分配成员数组和指针?

ios - 如何在cocos2d中添加iPhone5支持

iOS In App Purchase 请求登录两次

ios - 如何从json解析图片URL

c# - 将 View 绑定(bind)到 ViewModel 时 WPF 中的工具提示内存泄漏