Утечка памяти, переназначение свойства NSArray - PullRequest
0 голосов
/ 07 марта 2012

У меня есть UITableView, поддерживаемый NSArray свойством. Массив объявлен как свойство:

@property (nonatomic, retain) NSArray *events;

@synthesize events;

И используется в следующих методах. Инструменты постоянно говорят мне, что populateEvents вызывает утечки. Я пробовал многочисленные варианты этого кода, но в итоге получаю либо больше утечек, либо EXC_BAD_ACCESS.

- (void)viewDidLoad
    {
        self.events = [self populateEvents];
    }

    - (void)updateData
    {   
        events = nil;
        self.events = [self populateEvents];

        [self.tableView reloadData];
    }

    - (NSArray*)populateEvents
    {
        NSMutableArray *response = [[NSMutableArray alloc] init];

        NSString *sql = [NSString stringWithFormat:@"SELECT * FROM Event"];
        sqlite3_stmt *statement = [database prepare:sql];

        if(statement != nil)
        {
            // Loop through the results and add them to the response
            while(sqlite3_step(statement) == SQLITE_ROW)
            {
                Event *event = [[Event alloc] init];
                event.subject = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
                e

                [response addObject:event];
                [event release];
            }
            sqlite3_finalize(statement);
        }
        return [response autorelease];
    }

UPDATE Многие из вас спрашивают о классе мероприятия:

@interface Event : NSObject

@property (nonatomic) NSInteger Id;
@property (nonatomic, retain) NSString *subject;
@property (nonatomic, retain) NSString *details;
@property (nonatomic, retain) NSString *startTime;
@property (nonatomic, retain) NSString *endTime;
@property (nonatomic, retain) NSString *eventType;
@property (nonatomic, retain) NSString *employee;

@end

- (void)dealloc
{
    [super dealloc];

    [subject release];
    [details release];
    [startTime release];
    [endTime release];
    [eventType release];
    [employee release];
}



- (NSString*)startTime
{
    return [self humanReadableDate:startTime];
}



- (NSString*)endTime
{
    return [self humanReadableDate:endTime];
}



- (NSString*)humanReadableDate:(NSString*)isoDate
{
    NSDateFormatter* formatter = [[[NSDateFormatter alloc]init]autorelease];
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];

    NSDate* date = [formatter dateFromString:isoDate];

    [formatter setDateFormat:@"MMM dd yyyy HH:mm"];
    NSString* humanrReadable = [formatter stringFromDate:date];

    return humanrReadable;
}
@end

Ответы [ 4 ]

4 голосов
/ 07 марта 2012

это утечка, потому что вы меняете указатель вашего NSArray (события) на ноль, не освобождая предыдущий объект.Вы потеряли указатель на свой предыдущий массив, что привело к утечке.

измените

events = nil;

на

self.events = nil;
1 голос
/ 07 марта 2012

Просто установите эту переменную среды в панели групп и файлов проекта XCode, вы найдете исполняемые файлы -> Ваше приложение -> Правый клик -> Получить информацию -> Вкладка Аргументы -> Переменные среды

Имя: NSZombieEnabledЗначение: ДА

Это поможет вам найти зомби-объект вашего объекта, если есть какой-либо объект, который вы отпускаете более одного раза после доступа к этому значению.

Best of Luck!

1 голос
/ 07 марта 2012

Вы должны освободить внутренние объекты в Events классе до вызова [super dealloc].

И удалите это events = nil; в методе updateData. Это не нужно и вызовет проблемы даже после того, как вы исправите класс Events.

1 голос
/ 07 марта 2012

Проблема в строке

event = nil;

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

Вы можете просто вызвать self.events = [self populateEvents];сначала выпустит предыдущий объект перед назначением и сохранит объект.

...