Создание авто-релизных объектов в iPhone Development - PullRequest
1 голос
/ 06 января 2010

У меня есть требование создать несколько NSDecimalNumber объектов объектов как часть моего приложения (поскольку мне требуется точность вычислений, которую они предлагают), но я отмечаю, что в вычислениях они возвращают объекты NSDecimalNumber, которые, предположительно, автоматически высвобождаются.

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

Вопрос касается не только конкретно NSDecimalNumber, но и иногда неизбежного созданияавтоматически выпущенные объекты в процессе разработки приложения для iPhone.

Любые подробные ответы по этому вопросу будут с благодарностью получены.

Ответы [ 4 ]

8 голосов
/ 06 января 2010

Помните, что вы можете создавать свои NSAutoreleasePool объекты.

Например:

for (int i = 0; i < 1000; ++i) {
  NSAutoreleasePool * p = [[NSAutoreleasePool alloc] init];
  for (int j = 0; j < 1000; ++j) {
    NSString * s = [NSString stringWithFormat:@"%d,%d", i, j];
    NSLog(@"%@", s);
  }
  [p release];
}

Если вы сделаете это, у вас никогда не будет более 1000 таких строк одновременно.

7 голосов
/ 06 января 2010

Да, создание множества автоматически выпущенных экземпляров на iPhone может создать проблемы с памятью, особенно в тесном цикле, поэтому я стараюсь избегать их, когда могу. Вы можете создавать собственные пулы автоматического выпуска для управления этим, но они также добавляют некоторые накладные расходы на производительность и дополнительный код, который вы должны отслеживать.

По этой причине, когда я выполняю высокоточные вычисления, я склонен использовать структуру NSDecimal C вместо NSDecimalNumbers. Фактически, я выполнил некоторые тесты по этому вопросу и обнаружил значительное увеличение производительности при работе со структурой C (скопировано из моего ответа здесь ):

NSDecimal

Additions per second: 3355476.75
Subtractions per second: 3866671.27
Multiplications per second: 3458770.51
Divisions per second: 276242.32

NSDecimalNumber

Additions per second: 676901.32
Subtractions per second: 671474.6
Multiplications per second: 720310.63
Divisions per second: 190249.33

Как видите, скорость вычислений между путями NSDecimal и NSDecimalNumber почти в пять раз больше. Самое большое различие между вычислениями NSDecimal и NSDecimalNumber было распределением памяти экземпляров NSDecimalNumber. Поэтому вам следует избегать размещения временных автоматически выпущенных экземпляров везде, где вы можете.

3 голосов
/ 06 января 2010

Если вас беспокоит обработка слишком большого количества автоматически выпущенных объектов, вы можете создать собственный пул автоматического выпуска (см. Управление памятью ):

for (count = 0; count < limit; count++)
{
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
    NSString *fileContents;
    NSString *fileName;

    fileName = [args objectAtIndex:count];
    fileContents = [[[NSString alloc] initWithContentsOfFile:fileName] autorelease];
    // this is equivalent to using stringWithContentsOfFile:

    /* Process the file, creating and autoreleasing more objects. */

    [loopPool release];
}
0 голосов
/ 06 января 2010

Каждый объект, которому дается кусок памяти, должен будет отказаться от него. Вопрос в том, когда.

Я пытаюсь alloc/init/release, когда могу, чтобы объекты болтались столько, сколько нужно.

Если я использую autorelease, у меня меньше контроля над моментом освобождения объекта. Если приложение пытается получить доступ к освобожденному объекту, это может привести к сбою. Так что более точное управление памятью - хорошая вещь, я думаю.

Пока вы сохраняете автоматически освобожденные объекты, возвращаемые методом, все будет в порядке. (Если вы не спросите о чем-то другом, в этом случае я заранее извиняюсь.)

...