在我的项目中的 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;
仍然存在内存泄漏。
任何解决此泄漏的想法。
最佳答案
因此,对于您的情况,您无需将实例设置为 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/