Сравните NSDate на сегодняшний день или вчера

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

Так или иначе вот то, что у меня есть "работа":

    NSCalendar *calendar = [NSCalendar currentCalendar];    
    NSDate *currentDate = [NSDate date];
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    // set tomorrow (0: today, -1: yesterday)
    [comps setDay:0];
    NSDate *dateToday = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
    [comps setDay:-1];
    NSDate *dateYesterday = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
    [comps release];


NSString *todayString = [self.dateFormatter stringFromDate:dateToday] ;
NSString *yesterdayString = [self.dateFormatter stringFromDate:dateYesterday] ;
NSString *refDateString = [self.dateFormatter stringFromDate:info.date];

if ([refDateString isEqualToString:todayString]) 
{
    cell.title.text =  @"Today";
} else if ([refDateString isEqualToString:yesterdayString]) 
{
    cell.title.text =  @"Yesterday";
} else 
{
    cell.title.text =  [self.dateFormatter stringFromDate:info.date];
}

Теперь к проблеме (проблемам):

Это, кажется, awefull партия кода для просто даты comparinson, есть ли более легкий путь?

И самым важным вопросом является выпуск всех объектов. Как, возможно, предположил, я использую это в UITableViewController. У меня также есть эти строки в моем коде:

//[calendar release];
//[currentDate release];
//[dateToday release];
//[dateYesterday release];
//[todayString release];
//[yesterdayString release];
//[refDateString release];

Проблема состоит в том, что как скоро, что я некомментирую одну из этих строк, мои сбои приложения и я понятия не имеют почему?! Я надеюсь, что кто-то может просветить меня здесь.

Спасибо партия.

9
задан elementsense 23 May 2010 в 22:55
поделиться

2 ответа

Самый простой способ сделать это - просто сравнить описание дат:

// Your dates:
NSDate * today = [NSDate date];
NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-86400]; //86400 is the seconds in a day
NSDate * refDate; // your reference date

// 10 first characters of description is the calendar date:
NSString * todayString = [[today description] substringToIndex:10];
NSString * yesterdayString = [[yesterday description] substringToIndex:10];
NSString * refDateString = [[refDate description] substringToIndex:10];

if ([refDateString isEqualToString:todayString]) 
{
    cell.title.text =  @"Today";
} else if ([refDateString isEqualToString:yesterdayString]) 
{
    cell.title.text =  @"Yesterday";
} else 
{
    cell.title.text =  refDateString;
}

Если вы хотите изменить формат строки даты, вы можете использовать descriptionWithLocale: вместо этого.

13
ответ дан 4 December 2019 в 10:30
поделиться

Вы можете сравнить два объекта NSDate с помощью метода isEqualToDate, вернет логическое значение (да или нет) сообщая вам, совпадают ли даты. См. Документацию Apple .

Что касается освобождения объектов - правило в objective-c состоит в том, что вы освобождаете только те объекты, для которых вы выделяете память в ходе вашего метода. Единственный объект, для которого вы специально выделяете память в своем коде, - это comps , так что это единственный объект, который вы должны выпустить - и вы это сделали. Освобождение памяти для объектов, которые вы никогда не выделяли, вероятно, является причиной сбоя вашего приложения. Когда методы, которые фактически распределили эти объекты, пытаются освободить их или другая ссылка на них пытается получить к ним доступ, они вызывают ошибку EXC_BAD_ACCESS, поскольку вы их уже освободили!

Так что не просто закомментируйте эти строки выпуска, удалите их из своего скрипта - в них нет необходимости!

-1
ответ дан 4 December 2019 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: