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;
}
Почему бы не установить
self.title
в-viewDidLoad
?Все ли строковые литералы всегда загружаются в память?
2 ответа
Строковые литералы компилируются в ваш исполняемый файл - они не являются ресурсами. Они хранятся в разделе инициализированных статических данных в исполняемом файле. Так что да, на самом базовом уровне они находятся в памяти при загрузке исполняемого файла, то есть при запуске программы.
Хотя есть пейджинг. Иногда, когда памяти становится мало, возможно, что система выбрасывает части исполняемого файла из памяти, чтобы освободить некоторые, и перезагружает их, когда они необходимы. Этот процесс автоматический, прозрачный и непредсказуемый. Так что есть небольшая вероятность того, что строка не будет физически в памяти в какой-то момент времени, но как только вы попытаетесь получить к ней доступ, она будет волшебным образом там. Любое разбиение на страницы никогда не выполняется отдельно для каждой строки - оно выполняется в единицах по 4-8 КБ ("страниц").
В общем случае строковые литералы являются частью раздела данных в скомпилированном файле Mach-O. Поскольку весь код загружается "в память" при выполнении, это означает, что строковые литералы всегда загружаются и в память. Это, как говорится, все еще хорошая идея сохранить / освободить строки так же, как и другие объекты, даже если вы знаете, что они будут литералами.
В приведенном вами примере NSLocalizedString
вызов используется для интернационализации. Это не имеет никакого отношения (в отношении памяти) к строке, которую вы предоставляете.