在我的项目中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
还有内存泄漏。
解决此漏洞的任何想法。
答案 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;
}