Неправильное уменьшение количества ссылок

#xcode #ios #debugging #memory-leaks

#xcode #iOS #отладка #утечки памяти

Вопрос:

Я получаю неправильное уменьшение количества ссылок для объекта filemanager.

 -(void) checkDb{
BOOL success;
// Create a FileManager object, we will use this to check the status of the database and to copy it over if required
NSFileManager *fileManager = [NSFileManager defaultManager];

// Check if the database has already been created in the users filesystem
success = [fileManager fileExistsAtPath:dbPath];

if (success)
{
    //we found the file, we need to check version
    sqlite3 *db;
    //NSLog(@"Current Databasepath: %@",dbPath);
    // Open the current db (found in the user's filessytem)
    if(sqlite3_open([dbPath UTF8String], amp;db) == SQLITE_OK) {
        const char *sql = "select dbversion from settings";
        sqlite3_stmt *rs;
        if(sqlite3_prepare_v2(db,  sql, -1, amp;rs, NULL) == SQLITE_OK) {
            if (sqlite3_step(rs) == SQLITE_ROW) {
                //not eof
                int curDbVersion=sqlite3_column_int(rs,0);
                if (curDbVersion>=minDbVersion){
                    //good dbversion, no need to copy from resources
                    return;
                }
            }
        }
        sqlite3_finalize(rs);
    }
    sqlite3_close(db);
}

//we reached this section which means:
//either database was not found, or invalid db version
//so, we need to copy it from the resources directory (or maybe download it from internet?)

// Get the path to the database in the application package
NSString *dbPathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbName];

// Copy the database from the package to the users filesystem
[fileManager copyItemAtPath:dbPathFromApp toPath:dbPath error:nil];

[fileManager release];
  

}

Программа работает отлично, но когда я ее анализирую, я получаю предупреждение.

Вот скриншот предупреждения, которое я получаю:

Оригинал: grab.by/ahSi

Какие-либо намеки на то, что я мог пропустить?

Ответ №1:

Обратите внимание на строку, в которой вы создаете указатель FileManager:

 NSFileManager *fileManager = [NSFileManager defaultManager];
  

Нигде не найдены слова copy , new , alloc или retain : вы не являетесь владельцем FileManager, поэтому вам не следует его выпускать.

Ваша последняя строка:

 [fileManager release];
  

фактически пытается освободить defaultFileManager , которым вы, конечно же, не владеете.

Комментарии:

1. большое спасибо, теперь я понимаю это лучше.. я занимаюсь разработкой ios всего 2 недели .. и копаюсь в этом .. ура..

Ответ №2:

Не release используйте файловый менеджер — это локальная переменная, которая будет автоматически выпущена позже.

Комментарии:

1. 1 для «не выпускать файловый менеджер», но причина не имеет ничего общего с областью действия переменной. Просто код не выделяет, не копирует и не сохраняет файловый менеджер и, следовательно, не имеет права его выпускать.