Здравствуйте!
— Не хотите ли войти
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 по объявлению и инициализации констант

8 мая 2010

Ответы

  1. (и 2) Если я правильно понимаю, (а) и (б) — это одно и то же.
  2. (и 4) Да, эти переменные делают в точности то же, что и в С. Они — не являются частью спецификации Objective-C, описываются C-шными правилами по соответствующему стандарту.
  3. «Почему этот объект не удаляется пулом?» — потому что в момент создания нет пула. «И в какой момент инициализируется константа?» — грубо говоря, до первого к ней обращения.
  4. Да, тут будет «лик». Так как переменная создается (опять грубо) при запуске приложения и никогда не удаляется до выхода из него. С формальной точки зрения — это утечка. С прагматичной — и пофигу.
  5. Константы бывают разные. Если константа нужна в отдельном методе, можно объявить статическую переменную, которая инициализируется один раз и сохраняет значение между вызовами. Если константа — должна управляться извне, она кладется в файл настроек. Есть еще #define. И так далее.
8 мая 2010
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, ООО «Инру»
Вход
Имя пользователя:
Пароль:
Или…
Twi
Отмена
Войти
Восстановить забытый пароль…