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
方法中使用此值。谢谢您的指导。