2016-09-09 1 views
2

Получение утечки проводной памяти на NSNumberFormatter в моем проекте.получение утечки памяти в [[NSNumberFormatter alloc] init] в инструменте с проектом разрешения ARC

В то время как я проверяю свое приложение в 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; 

еще память утечка есть.

любая идея для устранения этой утечки.

Проверьте этот снимок экрана.enter image description here

ответ

3

Так что для вашего случая вы нет необходимости устанавливать экземпляр к нулю 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; 
} 
+0

Предложение довольно близко к решению утечки памяти, оно решает мою первую утечку, но все еще 'NSString * aFormattedNumber = [aNumberFormatter stringFromNumber: [NSNumber numberWithDouble: [dataVal doubleValue]]];' строка дает мне утечку в инструменте. любая идея почему? – CodeChanger

+0

Так что для этого вопроса я могу просто предложить. Поэтому я обновил ответ. Пожалуйста, попробуйте – iSashok

+0

его решена утечка памяти, но вы можете объяснить, почему вы делаете 'copy' &' convert' it в 'doublevalue'. Я очень хочу знать логику этого преобразования? – CodeChanger