Я использую инструменты, чтобы определить, есть ли в моем приложении места, где можно было бы более эффективно использовать память. Я нашел время, чтобы немного познакомиться с инструментами, но я обычно новичок в поиске проблем с управлением памятью, возникших из-за фона Java. Кажется, я использую около 1,82 МБ при вызовах этого метода:
+ (NSString *)stringFromDateWithFormat:(NSDate *)date withFormat:(NSString *)format
{
NSDateFormatter *dateFormatter;
NSString *result;
if (nil == date || nil == format)
return nil;
result = nil;
if (nil != (dateFormatter = [[NSDateFormatter allocWithZone:[self zone]] init])) {
[dateFormatter setDateFormat:format];
if (nil != (result = [dateFormatter stringFromDate:date])) {
[dateFormatter release];
return result;
}
[dateFormatter release];
}
return nil;
}
Когда я выпускаю средство форматирования даты, мне интересно, является ли NSString результат моей проблемой. Мне кажется, что вызов библиотеки stringFromDate вернет автоматически выпущенный объект, поэтому я ничего не могу сделать, чтобы «вручную» управлять им. Немного не знаю, как оптимизировать этот метод.





В любом случае вам нужно вернуть автоматически выпущенный объект, поэтому вам действительно ничего не нужно делать со строкой результата. Я не вижу ошибок, связанных с памятью, но ваш код определенно более подробный, чем нужно. Имейте в виду, что в Objective-C, если вы вызываете метод на nil, вы получаете обратно nil (или 0 для целого числа, но нет для значений с плавающей запятой). Вы можете удалить все эти операторы if и два пути возврата, и ваш код по-прежнему будет работать так же. Кроме того, я бы просто использовал alloc вместо allocWithZone.
Для нормального использования это не требуется, потому что ваши объекты всегда будут размещаться в одной и той же зоне по умолчанию. См. Эту статью: developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/MemoryMgm t /…
Я не на 100% согласен с этим. Я также только изучаю разработку для Mac / Iphone. Но вы можете использовать пул автоматического выпуска, чтобы помочь с управлением памятью. Он используется для решения проблем с выпуском.
Вот статья с лотами о управление памятью. Посмотрите левостороннее меню.
Вызывается ли этот метод много раз в цикле? Автоматически выпущенные объекты освобождаются только тогда, когда освобождается NSAutoreleasePool, в котором они находятся. Насколько я понимаю, пул автозапуска по умолчанию создается и освобождает каждый цикл событий. Возможно, вы создаете слишком много автоматически выпущенных объектов в ходе одного цикла событий. Решение состоит в том, чтобы создать собственный пул NSAutoreleasePool в подходящем месте и выпустить его для очистки автоматически выпущенных объектов. Крайний пример, иллюстрирующий эту мысль:
int i;
NSAutoreasePool* pool = nil;
for (i = 0; i < 1000000; ++i) {
/* Create a new pool every 10000 iterations */
if ((i % 10000) == 0) {
if (pool) [pool release];
pool = [[NSAutoreleasePool alloc] init];
}
[someObj someMethodThatCreatesAutoreleasedObjects];
}
[pool release];
В этом примере текущий пул освобождается каждые 10 000 итераций и создается новый. Вы можете узнать больше об управлении памятью в разделе Руководство по программированию управления памятью о пулах с автоматическим выпуском.
Можете ли вы сказать, почему бы вам не использовать allocWithZone?