1
ответ
FAQ по переменным obj-c
Здравствуйте! Хочу попросить у Вас провести мне маленький ликбез по переменным в obj-c.
Меня интересуют следующие классы переменных:
- (а) Переменная внутри блока @implementation
- (б) Переменная снаружи этого же блока.
- (в) Сложные константы
- внешние
- внутренние
Вопросы:
1) Что такое переменная класса (а)?
2) Что такое static-переменная класса (а)?
3) Правда ли, что переменная класса (б) это просто обычная сишная переменная
4) Что такое static-переменная класса (б): это тоже просто обычная сишная статик-переменная?
5) Напишем такой код: в h-файле
extern NSString * const kBackButtonText;
И в m-файле
NSString * const kBackButtonText = @"Назад";
Почему этот объект не удаляется пулом? И в какой момент инициализируется константа?
6) Рассмотрим класс. Вопросы изложил в комментариях в коде, продублирую ниже
static NSString *outerStaticVar;
@implementaion MyClass
static NSLock *mutex;
+ (void) initialize{
outerStaticVar = @"Hello world"; // нужно ли ретэйнить дополнительно, чтобы значение не съел
// пул? И если нужно ретэйнить, то где его потом релизить?.. Мозги говорят, что релизить не надо,
// однако инструменты тыкают как в лик.. Максимализм требует экрана чистого от утечек
}
....
@end;
7) Ваши Common-Practices по объявлению и инициализации констант
Ответы
- (и 2) Если я правильно понимаю, (а) и (б) — это одно и то же.
- (и 4) Да, эти переменные делают в точности то же, что и в С. Они — не являются частью спецификации Objective-C, описываются C-шными правилами по соответствующему стандарту.
- «Почему этот объект не удаляется пулом?» — потому что в момент создания нет пула. «И в какой момент инициализируется константа?» — грубо говоря, до первого к ней обращения.
- Да, тут будет «лик». Так как переменная создается (опять грубо) при запуске приложения и никогда не удаляется до выхода из него. С формальной точки зрения — это утечка. С прагматичной — и пофигу.
- Константы бывают разные. Если константа нужна в отдельном методе, можно объявить статическую переменную, которая инициализируется один раз и сохраняет значение между вызовами. Если константа — должна управляться извне, она кладется в файл настроек. Есть еще #define. И так далее.
3. Если говорить про cocoa touch, то в нём пул верхнего уровня объявлен внутри main-а. То есть вообще говоря ничего "true-runtime" не происходит без пула, который почистится при выходе из пр
4. Чисто любопытства ради -- где можно чистить такие переменные? Есть что-нибудь типо +(void)initialize: только наоборот?
5. Правда ли, что все пишут конструкции типа if (mutex != nil) { mutex = [[NSLock alloc] init];} , чтобы проверить, не создана ли ещё статическая переменная, и создать её по необходимости?
3 — эти переменные создаются до main'а. 4 — примерно нигде, только если килл приложения перехватить. 5 — да.
— alex
статические переменные еще частично можно инициализировать сразу при объявлении.
— alex
Зарегистрируйтесь или
войдите, чтобы добавить свой комментарий или ответ на вопрос.
© 2009-2012, ООО «Инру»