2

Я использую Objective C с ARC. У меня есть следующий фрагмент кода, который, кажется, теряет память из-за форматирования строк.Утечка памяти в String Formatter

Memory leak in stringWithFormat

Я изменил метод stringWithFormat удобства в более общий alloc init, но он по-прежнему утечку памяти в этой строке.

Memory leak in initWithFormat

Я прочитал here, что я должен использовать copy ключевое слово, но он по-прежнему утечки памяти в этой строке.

Memory leak with copy property

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

No memory leak without formatter

  1. Почему эта линия вызывает утечку памяти?
  2. Как я могу решить эту утечку памяти?

Дополнительная информация:

  • Код написан в: Xcode 6.3.1
  • Утечки памяти визуализированы с помощью: инструменты из Xcode 6.3.1
  • IOS развертывания Цель: IOS 5,0

Код базы:

#define DATABASE_NAME   @"orderwriter" 

+ (SQLiteManager *) getSQLiteManager 
{ 
    // NSInteger userId = [(NSString *)[AppUtil NSDefaultforKey:USER_ID] integerValue]; 
    // NSString *dbName = [NSString stringWithFormat:@"%@_%ld.db", DATABASE_NAME, (long)userId]; 
    NSString *dbName = @"orderwriter_58.db"; 
    SQLiteManager *dbManager = [[SQLiteManager alloc] initWithDatabaseNamed:dbName]; 
    return dbManager; 
} 

Класс SQLiteManager, я нашел здесь на Github.

+1

Имея только изображения кода, вы пытаетесь подвергнуть сомнению код. Код примера не предоставляет 'DATABASE_NAME', поэтому код не может быть протестирован. – zaph

+0

Xcode 6.3.1 не обеспечивает целевую установку iOS 5 развертывания, как вы это выбрали? –

+0

http://stackoverflow.com/questions/7105127/xcode-4-target-deployment-target-vs-project-deployment-target –

ответ

1

Метод stringWithFormat возвращает объект с автореализацией. Он не будет выпущен до тех пор, пока пул релиза не будет удален. Вы бегаете в фоновом потоке случайно? Если это так, вам может понадобиться создать пул автозапуска в начале кода потока и слить его, когда вы закончите.

Если нет, то я не уверен, почему у вас будет утечка. ARC должен правильно владеть этой строкой. Возможно, это ошибка компилятора. Какую версию Xcode вы используете?

Если это не проблема с автообновлением, вам, вероятно, следует подать радарную ошибку с Apple.

+1

Может быть. Для @physicalattraction, является ли DATABASE_NAME константой '# define'd или макросом? Отправьте определение. –

+0

Я не запускаю этот кусок кода в фоновом потоке. Я добавил описание DATABASE_NAME и соответствующего кода в текстовом формате. – physicalattraction