2009-10-07 2 views
0

Я проверяю объекты дня в своем расписании Словарь и хочу знать, что делать с указателем «День», когда я закончил. Build and Analyze не жалуется на это, но он просто сидит, насмехаясь надо мной. Я чувствую, что он просто сидит там, когда функция заканчивается, и, возможно, даже новый создается каждый раз через цикл. Кроме того, при выпуске дня каждый раз через цикл я заканчиваю выпуск исходного объекта. Есть идеи?Какова перспектива управления памятью?

- (NSUInteger) showsInTheNext:(NSUInteger)days { 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyyLLdd"]; 

    if(days == 0) days = 91; 
    NSUInteger shows = 0; 

    for (NSUInteger x = 0; x < days; x++) 
    { 
     Day *day = [self.schedule objectForKey:[dateFormatter stringFromDate:[self.date addTimeInterval:60*60*24*x]]]; 
     if((day != nil) && ([day.type isEqualToString:@"Show"])) shows++; 
     //[day release]; 
    } 

    [dateFormatter release]; 
    return shows; 
} 

ответ

1

NSDictionary сохраняет NSObject подкласс, когда он добавляется к NSDictionary. Когда вы извлекаете его обратно, никакого дополнительного сообщения retain не отправлено, поэтому вы должны отбросить указатель без отправки сообщения release.

Если объект удаляется из словаря, то NSDictionary реализация будет посылать release сообщений объекта удаляется.

Вы можете проверить это, выполнив проверки уровня отладки retainCount, чтобы убедиться, что он не изменяется.

+0

ОК, так как же я могу отказаться от указателя? Я думал, что когда я создаю этот новый указатель, возможно, удержание счета объекта, на которое указывает, увеличивается и, следовательно, может быть не выпущено, когда я в конечном итоге удалю его из расписания Dictionary. – rob5408

+0

Указатель, который вы указали выше, является только указателем - ничего не происходит с назначенным ему объектом, когда он назначен. Таким образом, в этом случае сообщение об удержании не будет отправлено объекту, найденному из словаря. Чтобы отбросить указатель, вы просто выполняете то, что вы делаете в приведенном выше примере: ничего. – fbrereto

+0

woohoo! благодаря! – rob5408

1

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

Смежные вопросы