Objective-C: все ли строковые литералы всегда загружаются в память? - PullRequest
3 голосов
/ 04 сентября 2011

В UIViewController подклассах я часто вижу:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Home", nil);
    }
    return self;
}
  1. Почему бы не установить self.title в -viewDidLoad?

  2. Все ли строковые литералы всегда загружаются в память?

Ответы [ 2 ]

7 голосов
/ 04 сентября 2011

Как правило, строковые литералы являются частью раздела данных в скомпилированном файле Mach-O.Поскольку весь код загружается «в память» при выполнении, это означает, что строковые литералы всегда загружаются и в память.Это, как говорится, все еще хорошая идея, чтобы сохранить / освободить строки так же, как и другие объекты, даже если вы знаете, что они будут литералами.

В приведенном вами примере, NSLocalizedStringВызов используется для Интернационализация .Это не имеет никакого отношения (в отношении памяти) к вводимой вами строке.

4 голосов
/ 04 сентября 2011

Строковые литералы компилируются в ваш исполняемый файл - они не являются ресурсами.Они хранятся в разделе инициализированных статических данных в исполняемом файле.Так что да, на самом базовом уровне они находятся в памяти всякий раз, когда загружается исполняемый файл, то есть всякий раз, когда запускается программа.

Хотя существует подкачка.Иногда, когда память заканчивается, возможно, что система выбрасывает части исполняемого файла из памяти, чтобы освободить некоторые, и перезагружает их, когда они необходимы.Этот процесс автоматический, прозрачный и непредсказуемый.Так что есть небольшая вероятность того, что строка не будет физически в памяти в какой-то момент времени, но как только вы попытаетесь получить к ней доступ, она будет волшебным образом там.Любое разбиение на страницы никогда не выполняется для каждой строки - оно выполняется в единицах по 4-8 КБ ("страниц").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...