Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 正在使用ARC启用项目的仪器中获取[[NSNumberFormatter alloc]init]中的内存泄漏_Ios_Objective C_Memory Leaks - Fatal编程技术网

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

Ios 正在使用ARC启用项目的仪器中获取[[NSNumberFormatter alloc]init]中的内存泄漏,ios,objective-c,memory-leaks,Ios,Objective C,Memory Leaks,在我的项目中获取NSNumberFormatter上的有线内存泄漏 当我在Instrument中检查我的应用程序时,我发现很多框架漏洞,其中一个非常令人惊讶的漏洞是NSNumberFormatter漏洞,而我正在分配格式化程序对象 这是我设置数字值格式的函数: //Set Number Formatter - Like 1000 = 1,000 + (NSString *)getNumberWithNumberFormate:(NSString*)dataVal{ NSNumberFor

在我的项目中获取
NSNumberFormatter
上的有线内存泄漏

当我在
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;
仍然存在内存泄漏

有没有解决这个漏洞的办法


检查此仪器屏幕截图。

因此,对于您的情况,无需将实例设置为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;
}
此外,对于下面这样的格式化程序,良好实践还使用
静态
实例和
调度_一次

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

建议很快就要解决内存泄漏了,它解决了我的第一个泄漏,但仍然
NSString*aformatedNumber=[aNumberFormatter stringFromNumber:[NSNumber numberWithDouble:[dataVal doubleValue]]给出仪表泄漏的线路。知道为什么吗?所以对于这个问题我可以提出建议。所以我更新了答案。请尝试它解决了我的内存泄漏问题,但您能解释一下为什么要将
copy
&
转换为
doublevalue
我非常想知道转换背后的逻辑吗?我为incapsulate字符串param复制(它创建了param的新实例),并且它有助于仅使用此实例在方法内部工作。我保证输入参数在运行时不会随机改变。
doubleValue
只要转换字符串并返回double,您就可以在
stringFromNumber
方法中使用此值。谢谢您的指导。