2012-04-20 35 views
6

Widziałem wiele pytań/odpowiedzi na temat wycieków pamięci w NSDateFormatter, ale żaden nie wydaje mi się pomóc mi określić, co powoduje wyciek pamięci w mojej aplikacji. Tu jest mój kodu:Wyciek pamięci podczas używania NSDateFormatter

- (id)init 
{ 
    if ((self = [super init])) 
    { 
     items = [[NSMutableArray alloc] init]; 
     events = [[NSMutableArray alloc] init]; 
     buffer = [[NSMutableData alloc] init]; 
     format = [[NSDateFormatter alloc] init]; 
     lastFromDate = @""; 
    } 
    return self; 
} 

- (void)presentingDatesFrom:(NSDate *)fromDate to:(NSDate *)toDate delegate:(id<KalDataSourceCallbacks>)delegate 
{ 
    [format setTimeZone:[NSTimeZone systemTimeZone]]; 
    [format setDateFormat:@"MM/dd/yyyy"]; 
    NSString *stringFromDate = [NSString stringWithString:[format stringFromDate:fromDate]]; 
    NSString *stringToDate = [NSString stringWithString:[format stringFromDate:toDate]]; 

    NSLog(@"From date: %@, To date: %@", stringFromDate, stringToDate); 

    [self didDatesChange:stringFromDate]; 

    if (dataReady) { 
     [callback loadedDataSource:self]; 
     return; 
    } 
    callback = delegate; 
    [self retrieveEventData:stringFromDate to:stringToDate]; 
} 

- (void)dealloc 
{ 
    [items release]; 
    [events release]; 
    [buffer release]; 
    [lastFromDate release]; 
    [format release]; 
    [super dealloc]; 
} 

Kiedy uruchamiam „Profil” -> „Przecieki”, pojawia się przeciek pamięci za każdym razem, gdy funkcja jest wywoływana na linii

NSString *stringFromDate = [NSString stringWithString:[format stringFromDate:fromDate]]; 

Może ktoś wyjaśnić, co może być dziać się? dzięki Mike

+1

proszę pisać didDatesChange a retrieveEventDa ta: to :. ponieważ nie ma oczywistych przecieków w kodzie w twoim pytaniu, moje przypuszczenie jest niezrównoważonym zatrzymaniem wewnątrz jednej z tych metod. – danh

+1

dlaczego Instruments wskazuje mi linię, w której jest sformatowany NSDate, jeśli przecieki były w jednej z tych funkcji? –

Odpowiedz

2

FYI można to zmienić:

NSString *stringFromDate = [NSString stringWithString:[format stringFromDate:fromDate]]; 

do tego:

NSString *stringFromDate = [format stringFromDate:fromDate]; 

stringWithString należy zwrócić autoreleased NSString choć tak nie wierzę, że jest źródłem twojego nieszczelność. Wygląda na to, że nie ma przecieku w moim kodzie.

2

po prostu użyć metody miech Get ciąg od daty jego praca poprawnie ......

-(NSString *)StringFromDate:(NSDate *)DateLocal{ 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"MM/dd/yyyy"]; 
    NSString *dateString = [dateFormat stringFromDate:DateLocal]; 
    NSLog(@"Date is HERE =====>> %@",dateString); 
    return dateString; 
} 

po kiedy chcesz dostać data ciąg wystarczy użyć jak mieszka ....

NSString *stringFromDate = [self stringFromDate:fromDate]]; 
[stringfromdate retain]; 
NSString *stringToDate = [self stringFromDate:toDate]]; 
[stringTodate retain]; 

i powyżej - (NSString *) StringFromDate: (NSDate *) metoda DateLocal to należy zdefiniować w pliku viewcontroller.m .... Jego praca w porządku ....

+1

musisz zwolnić NSDateFormatter, którą przydzieliłeś w metodzie. –

+0

Tak, wiem, ale teraz właśnie zdefiniowałem kod, który jest użyteczny dla użytkownika z jego problemem, używam dateFormat globaly w mojej aplikacji ..... chociaż Thanx ... :-) –

+1

Mam NSDateFormatter zdefiniowany globalnie, ponieważ ja don nie chcesz tworzyć nowego za każdym razem, gdy ta funkcja jest wywoływana. To odtwarzałoby go za każdym razem, prawda? Czy ma to jakieś zalety/wady? –