2012-07-02 3 views
0

Это чрезвычайно простой вопрос. Когда я инициализировать объект как так ...Как инициализировать объект, используя локальную переменную

UIView *view; 
if (!view) { 
    view = [[UIView alloc] init]; 
} 
// Do something with view 

Я не получаю ошибки компилятора, но я заметил, Xcode не выделяет UIView, как это обычно делает. Я использую неправильную практику для инициализации?

ответ

3

Я вижу две проблемы с этим кодом:

  1. Objective-C не гарантирует инициализации локальных переменных, так view может быть 0, указатель на что-то другое, или значение мусора.
  2. Даже если Objecitve-C инициализирует переменную для вас, это не имеет большого значения для проверки ее значения сразу после объявления.

Вы действительно объявляете это как переменную экземпляра где-то еще?

Что касается выделения, которое не отображается в UIView? И то и другое? Я попробую перезагрузить файл или перезапустить Xcode.

Чтобы устранить эти два вопроса я назвал, заменить, что с этим кодом:

UIView *view = [[UIView alloc] init]; 

Возникает еще один вопрос: под АРК, ваш вновь распределённая вид будет освобождаться, когда переменная выходит из области видимости, если не хранить он в переменной экземпляра или структуре (например, супервизор) хранит его где-то в другом месте.

Если вы используете ручной удержание-освобождение вместо ARC, вы будете пропускать UIView каждый раз, когда вызывается этот метод.

+0

хорошие точки @ инициализации –

+0

'UIView' до того, как инструкция if не подсвечена – mnort9

+0

Да, я полагал, что это неверно. Мне просто нужно было объявить его каким-то образом сделать что-то с видом (изменить свойство или добавить в subview и т. Д.). Если я объявляю в выражении if, я не могу ничего с ним сделать после проверки. Каков правильный способ объявления в этом случае? – mnort9

0

Да, это хороший способ сделать это. Если вы хотите, вы можете поместить этот оператор if внутри метода, называемого view, и вернуть его; это называется ленивым мгновением и является чрезвычайно распространенным и принятым.

+1

Только под ARC; при не-ARC локальные переменные не инициализируются известному значению ... – bbum

2

Вы не объявляете локальный var, а затем проверяете, является ли оно nil - не имеет смысла.

С другой стороны, если это свойство, то да, ленивая instantiantion:

if (!myView) { 
    myView = [[UIView alloc] init]; 
} 
+0

Местные жители инициализируются в ObjC? Cite please ... –

+0

На самом деле это не всегда будет nil, его значение не определено (насколько я знаю ...) – borrrden

+0

исправлена ​​ошибка. –

1

Пожалуйста, пусть будет некоторый код между первой линией и второй линией. Потому что, если нет, вы читаете значение неинициализированной локальной переменной, и это неопределенное поведение. Это означает, что это может быть отличным от нуля по чистой случайности.

Если у вас есть ivar, это другое. Они инициализируются до нуля при построении экземпляра.

+1

При компиляции с ARC указатели объектов инициализируются на 0. –

0

Как бы то ни было, это грязно, и на самом деле нет смысла. Зачем вы проверяете локальную переменную, прежде чем ее выделить? Если это изменено, и на самом деле это метод ленивой загрузки переменной экземпляра или свойства, то да, это хороший способ. Если это просто нормальная переменная, то в лучшем случае это всего лишь шум, а в худшем случае вы создали висячий указатель.

Смежные вопросы