Каков источник объекта с утечкой для этого кода? - PullRequest
1 голос
/ 25 мая 2011

Любой, кто в состоянии помочь, является источником объекта с утечкой для этого кода:

Мое приложение компилируется без каких-либо проблем с АНАЛИЗОМ. Когда я запускаю PROFILER и смотрю на утечки памяти, я вижу, что утечки появляются. Одна из этих утечек находится в моем объекте WeekendEvent. В инструментах есть 3 элемента строки «Утечка блока», указанные ниже (я отметил в коде, на который они указывают):

  • Маллок + 1
  • Сохранить + 2
  • Релиз + 1

Вопрос - Я предполагаю, что это подразумевает, что существует утечка, однако, откуда будет эта утечка. Сегменты моего кода, по которым кликают инструменты, выделены ниже. Мне кажется, что все в порядке:

  1. созданное мной WeekendEvent, которое я выпускаю после перехода в метод addWeekendEvent
  2. в addWeekendEvent он просто добавляет его в NSMutableArray, и поэтому я подумал, что компоновка выполняет какое-либо управление памятью для своего объекта, который он содержит
  3. Я тоже освобождаю NSMutableArray в dealloc

Ключевые биты исходного кода и основные характеристики

// ------Weekends Method (plural)-----
WeekendEvent *weEvent = [[WeekendEvent alloc] init]; // [INSTRUMENTS - 87.5%]
[week addWeekendEvent:weEvent];                      // [INSTRUMENTS - 12.5%]
[weEvent release];                  


//------Weekend *.h ------------
@interface Weekend : NSObject {
    NSMutableArray*     _events;     
}
- (void)addWeekendEvent:(WeekendEvent*)weEvent;
@property (nonatomic, retain) NSMutableArray* events;
@end


//------Weekend *.m -------------
- (void)addWeekendEvent:(WeekendEvent*)weEvent {
    [self.events addObject:weEvent];
}
- (void) dealloc {
    [_events release];
    [super dealloc];
}

РЕДАКТИРОВАТЬ : некоторый дополнительный код о том, как создавалась / использовалась переменная "week", указанная выше, поэтому в методе выходных код, который я разместил, был внутри цикла for - код с циклом for, показанным поэтому было:

for (Weekend *week in self.items) {
   // do pass "week.start" to some methods (which is an NSDate) - don't think this would be relevant though?
   WeekendEvent *weEvent = [[WeekendEvent alloc] init]; // [INSTRUMENTS - 87.5%]
   [week addWeekendEvent:weEvent];                      // [INSTRUMENTS - 12.5%]
   [weEvent release];   
}               
// Note - self.items I checked is "released" in the dealloc method

EDIT 2 - просто чтобы подтвердить, это экземпляр "WeekendEvent", который Instruments выделяет в столбце "объекты утечки". На всякий случай, это неясно.

РЕДАКТИРОВАТЬ 3 - Как настроить переменную элементов - биты кода клавиши:

@interface Weekends : NSObject {
    NSMutableArray* _items;
}
@property (nonatomic, retain) NSMutableArray* items;

@synthesize items = _items;
- (void) dealloc {
    [_items release];
    [super dealloc];
}

1 Ответ

1 голос
/ 25 мая 2011

Управление памятью в коде, который вы показываете, корректно, при условии, что остальная часть вашего Weekend класса выглядит примерно так:

@synthesize events = _events;

- (id)init {
    if ((self = [super init]) == nil) { return nil; }
    _events = [[NSMutableArray alloc] initWithCapacity:0];
    return self;
}

Кроме того, результаты инструментов соответствуют всему вашему коду:

Malloc  +1  ==  WeekendEvent *weEvent = [[WeekendEvent alloc] init];
Retain  +2  ==  [week addWeekendEvent:weEvent];
Release +1  ==  [weEvent release];

Исходя из этой логики, наиболее вероятным кандидатом является то, что ваш week объект не был должным образом освобожден. Вы не показали код, объясняющий, как он был создан, но я заметил, что код, который вы сделали , предназначен для класса Weekend. Вы уверены, что week не относится к другому типу?

...