[英]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. 解决此泄漏的任何想法。
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 = nil
在getNumberWithNumberFormate
类方法超出范围后, 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.