Новичок просачивается, что я не совсем понимаю - PullRequest
0 голосов
/ 18 августа 2010

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

- (void) readHistoryFromDatabase { база данных sqlite3 *;

NSMutableArray *days = [[NSMutableArray alloc] init];

NSInteger currentMonth;

int noMonths = 0;

int historyCount = 0;

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];

[dateFormat setDateFormat:@"yyyy-MM-dd"];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"database.sqlite"];

if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) { 
    const char *sqlStatement = "select data, rata, var, strftime('%m', data) month from rates where id=?"; 
    sqlite3_stmt *compiledStatement; 

    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
        sqlite3_bind_int(compiledStatement, 1, id);
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
            NSDate   *data      = [dateFormat dateFromString:[NSString stringWithUTF8String:(char *) sqlite3_column_text(compiledStatement, 0)]];
            NSString *rata      = [NSString stringWithUTF8String:(char *) sqlite3_column_text(compiledStatement, 1)];
            NSString *var       = [NSString stringWithUTF8String:(char *) sqlite3_column_text(compiledStatement, 2)];
            NSInteger month     = sqlite3_column_int(compiledStatement, 3);

            if ((currentMonth != month) && (historyCount > 0)) {
                [self.rate setValue:[days copy] forKey:[NSString stringWithFormat:@"%d", noMonths]];

                noMonths++;
                [days removeAllObjects];
                currentMonth = month;
            } else if (historyCount == 0) {
                currentMonth = month;
            }

            CHis *new = [[CHis alloc] init]; 
            new.rata  = rata;
            new.var   = variatie;
            new.month = month;
            new.data  = data;
            historyCount++;
            [days addObject:new];
            [new release];
        }
        if ([days count] > 0) {
            [self.rate setValue:[days copy] forKey:[NSString stringWithFormat:@"%d", noMonths]];
        }
    }
    sqlite3_finalize(compiledStatement);
}
[dateFormat release];
[days release];
sqlite3_close(database);

}

self.rate определяется следующим образом:

@ свойство (неатомное, сохранение) NSMutableDictionary * rate;

и в viewDidLoad:

self.rate = [[NSMutableDictionary alloc] init];

В основном эта часть кода считывает из базы данных некоторые показатели. В зависимости от месяца в NSDictionary будет добавлена ​​пара месяцев и массив с курсами.

Я не понимаю, где утечка. Я знаю, что, возможно, это что-то очень простое, но я уже 2 дня ищу решение ...

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

[[NSMutableDictionary alloc] init] возвращает объект с сохраненным счетом 1. Затем вы присваиваете ему значение self.rate, что увеличивает сохраняемый счет (будет 2).Если вы назначите что-то еще для self.rate, количество сохраненных объектов предыдущего объекта снизится до 1. Но оно не достигнет 0.

Существует три решения:

// OK
self.rate = [[[NSMutableDictionary alloc] init] autorelease];

// Better, has the same effect as statement above
self.rate = [NSMutableDictionary dictionary];

// Clumsy, but works
NSMutableDictionary *tmp = [[NSMutableDictionary alloc] init];
self.rate = tmp;
[tmp release];

Помнитекаждый раз, когда вы звоните alloc/init или copy, вы получаете объект, которым владеете.Это означает, что вы немедленно несете ответственность за вызов release на них.Почти любой другой метод возвращает / должен возвращать объект, для которого вам не нужно вызывать release, за исключением случаев, когда вы вызывали retained для него, чтобы «заявить о праве собственности».

0 голосов
/ 18 августа 2010

В приборах, которые вы можете видеть, откуда происходят утечки, нажмите кнопку расширенных сведений и выберите свою утечку, затем вы увидите, из какого метода и файла и строки произошла утечка.

...