Использование пула автоматического выпуска в objectAtindex Swizzling для NSMutableArray - PullRequest
0 голосов
/ 13 ноября 2018
- (nullable id)myObjectAtIndex:(NSUInteger)index{
    @autoreleasepool {
        id value = nil;
        if (index < self.count)
        {
            value = [self myObjectAtIndex:index];
        }
        return value;
    }

}

Я не имею представления о цели использования autoreleasepool здесь. Может кто-нибудь помочь мне?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Нет научной причины.

Весь код является примером "панического кода этого приложения, и я не знаю почему":

Очевидно, что у автора возникла проблема с гарантией правильных индексов, что было бы правильным подходом,Поэтому он написал специальный метод, чтобы «починить» его.Наименование («мое») показывает, что он думал: я могу сделать это лучше (вместо того, чтобы застраховать правильные индексы).

Более того, добавление ARP к коду, который, очевидно, не создает большее количество объектов, является верным признаком того факта, что он больше не мог контролировать свой код.

Переместить весь код в /dev/null.

0 голосов
/ 13 ноября 2018

Если я не пропущу очевидное, что всегда возможно, мы можем только догадываться:

Существует стек автозапуска пулов, вершина которого используется. Когда вводится конструкция @autoreleasepool { ... }, новый пул создается и помещается в стек, при выходе из конструкции пул сливается и выталкивается из стека.

Причина создания локальных пулов приведена в NSAutoReleasePool документах ( выделение добавлено ):

Application Kit создает пул автообновления в главном потоке в начале каждого цикла цикла событий и сливает его в конце, освобождая тем самым любые автоматически выпущенные объекты, сгенерированные при обработке события. Если вы используете Application Kit, вам, как правило, не нужно создавать свои собственные пулы. Если ваше приложение создает много временных автоматически выпущенных объектов в цикле событий, однако, может быть полезно создать «локальные» пулы автоматического выпуска, чтобы помочь минимизировать пиковый объем памяти.

Так какова цель кода, который вы просматриваете? Некоторые догадки:

  • Либо первоначальный автор знает / считает, что вызванные методы count и objectAtIndex (отправка Swizzle) добавляют значительное количество объектов в пул автоматического выпуска и желает очистить их; или

  • Первоначальный автор планировал / планирует добавить будущий код к myObjectAtIndex, который добавит значительное количество объектов в пул автоматического выпуска и пожелает очистить их; или

  • Желает иметь возможность вызывать objectAtIndex и убедиться, что не влияет на память, используемую для живых объектов (например, возможно, они измеряли использование памяти чем-то другим); или

  • Кто знает, примите оригинального автора (надеюсь!)

НТН

...