Objective-C: все ли строковые литералы всегда загружаются в память?

В 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 ответа

Решение

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

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

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

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

Другие вопросы по тегам