Директива Objective-C autoreleasepool влияет на переменные вне области видимости. - PullRequest
0 голосов
/ 10 июня 2018

Допустим, у меня есть функция c ++, объединенная с членами target-c.Функция получает std::string и преобразует ее в NSstring*, и работает с этой переменной, прежде чем покинуть ...

Стоит ли ожидать, что NSstring* будет выпущен в конце autoreleasepool области видимости?

void myclass::myfunc(context& ctx)
{ 
    @autoreleasepool
    {
        std::string path = ctx.getData().path;
        NSString *nsPath = [NSString stringWithUTF8String:path.c_str()];
        ... (do something with nsString, Should it be released after leaving the scope ?)
    }
}

1 Ответ

0 голосов
/ 10 июня 2018

Нет, вам не нужно.В соответствии с правилом вам нужно освобождать переменную только в том случае, если вы увеличиваете количество сохранений одним из следующих способов:

  1. Инициализация с помощью new или alloc / init.
  2. Копирование с помощью copy.
  3. Увеличение счетчика удержаний с помощью удержания.

Если вы получаете переменную любым способом, кроме вышеупомянутых способов, вы не являетесь ее владельцем и, следовательно, не имеетене нужно выпускать его.

Строка, возвращаемая через [NSString stringWithUTF8String:path.c_str()], является строкой с автоматическим освобождением.Он будет выпущен после завершения текущего цикла выполнения.Так что вам не нужно выпускать его.

...