使用ARC启用项目在仪器中的[[NSNumberFormatter alloc] init]中获取内存泄漏

时间:2016-09-09 10:29:15

标签: ios objective-c memory-leaks

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

当我在NSNumberFormatter检查我的应用程序时,我正在收到许多框架泄漏,而且当我分配该格式化程序对象时,一个非常令人惊讶的泄漏是//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; 这个对象。

fetch_url

还有内存泄漏。

解决此漏洞的任何想法。

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

1 个答案:

答案 0 :(得分:3)

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

+ (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;
}