У меня есть приложение для iPhone, которое получает предупреждения о памяти, и поэтому я пытаюсь найти утечки, более эффективно использовать память и т. Д. С помощью инструментов. Помимо прочего, я пытаюсь удалить любые автоматически освобожденные объекты и заменить их на объекты alloc / init / release вручную. Однако некоторые вызовы API, по-видимому, не имеют версии init (см. Код ниже). По общему признанию, у меня есть несколько основных недоразумений:
Если я 'вызову' API и получу обратно по существу автоматически выпущенные объекты, могут ли эти объекты отображаться как утечки в Инструментах? Кажется, я вижу это поведение в инструментах.
Если да к 2, должен ли я просто проигнорировать, если нет альтернативы «без авто-релиза», и я использую API, который мне нужен? Кроме того, если этот код часто вызывается, я должен полностью переосмыслить алгоритм?
Вот некоторый служебный код из моего приложения, который часто вызывается. В основном определяет, являются ли две даты значимо «равными». Я оставил в закомментированном коде, чтобы вы могли видеть типы улучшений, которые мне нужны, в моей кодовой базе - этот DID уменьшает утечки памяти при последующем запуске в Instruments , когда я начал создавать вручную NSDate (и выпуск), который помог. Тем не менее, у меня все еще есть объекты компонента date, которые, как мне кажется, протекают ... но это вызов API (извините за форматирование кода, но я не могу улучшить его в SO):
+ (BOOL)isDayEqualToDay:(NSDate*)date anotherDate:(NSDate*)anotherDate
{
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//NSCalendar *cal;
NSDateComponents *componentsFromDate, *componentsFromAnotherDate;
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
//cal = [NSCalendar currentCalendar];
componentsFromDate = [cal components:unitFlags fromDate:date];
componentsFromAnotherDate = [cal components:unitFlags fromDate:anotherDate];
BOOL bDatesEqual = ([componentsFromDate year] == [componentsFromAnotherDate year] &&
[componentsFromDate month] == [componentsFromAnotherDate month] &&
[componentsFromDate day] == [componentsFromAnotherDate day]);
[cal release];
return bDatesEqual;
/*
return (
[componentsFromDate year] == [componentsFromAnotherDate year] &&
[componentsFromDate month] == [componentsFromAnotherDate month] &&
[componentsFromDate day] == [componentsFromAnotherDate day]
);*/
}
Я думаю, что componentFromDate и componentsFromAnotherDate отображаются как утечки, но там только объекты, по существу возвращаемые из вызова API NSData (autoreleased). Не уверен, что еще я мог бы сделать, чтобы сделать это более эффективным, и я подвергаю сомнению мое понимание того, как лучше всего использовать Инструменты. Предложения?