简体   繁体   English

在具有ARC enable项目的仪器中的[[NSNumberFormatter alloc] init]中获取内存泄漏

[英]getting memory leak in [[NSNumberFormatter alloc] init] in instrument with ARC enable project

Getting wired memory leak on NSNumberFormatter in my project. 我的项目中的NSNumberFormatter出现有线内存泄漏。

While i am checking my app in Instrument i am getting many framework leaks and one of very surprising leak was NSNumberFormatter leak while I am allocing that formatter object. 当我在Instrument检查我的应用程序时,我遇到了很多框架泄漏,而分配分配器对象时, NSNumberFormatter泄漏是一个非常令人惊讶的泄漏。

Here is my function to formatting my Number value: 这是格式化我的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;
}

while I am checking memory leak it will show 当我检查内存泄漏时,它将显示

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

This line as leak. 此行为泄漏。

I have also nil this object after my formatting done. 格式化完成后,我也将此对象nil

aNumberFormatter = nil;

still memory leak is there. 仍然有内存泄漏。

any idea to resolve this leak. 解决此泄漏的任何想法。

Check this instrument screenshot. 检查此仪器的屏幕截图。 在此处输入图片说明

So for your case you no need set instance to nil aNumberFormatter = nil The instance of NSNumberFormatter will destroy after getNumberWithNumberFormate class method will out of scope. 因此,对于您的情况,您无需将实例设置为n aNumberFormatter = nilgetNumberWithNumberFormate类方法超出范围后, NSNumberFormatter的实例将销毁。 Try to modify a bit your method to 尝试修改您的方法

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

Also the good practice use static instance and dispatch_once for formatter like below 同样好的做法是将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;
}

In this example you will use only one instance for every time of using this class method and will decrease memory usage 在此示例中,每次使用该类方法时,您将仅使用一个实例,并且将减少内存使用量

Answer for comment and clear debugging try to check this code 回答评论并清除调试尝试检查此代码

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM