Да это законно и работает над всеми платформами. Это правильно инициализирует Вашу членскую переменную a к переданному в значении a.
Это рассматривают некоторые более чистые для именования их по-другому хотя, но не все. Я лично на самом деле использую его много:)
Инициализация перечисляет с теми же работами имени переменной, потому что синтаксис объекта инициализации в списке инициализации следующие:
< member> (< value>)
можно проверить то, что я записал выше путем создания простой программы, которая делает это: (Это не скомпилирует)
class A
{
A(int a)
: a(5)//<--- try to initialize a non member variable to 5
{
}
};
, Вы получите ошибку компиляции что-то как: A не имеет поля названным 'a'.
<час>На ноте стороны:
Одна причина, почему Вы не можете хотеть использовать то же имя элемента в качестве названия параметра, состоит в том, что Вы были бы более подвержены следующему:
class A
{
A(int myVarriable)
: myVariable(myVariable)//<--- Bug, there was a typo in the parameter name, myVariable will never be initialized properly
{
}
int myVariable;
};
<час> На ноте (2) стороны:
Одна причина, почему можно хотеть использовать то же имя элемента в качестве названия параметра, состоит в том, что Вы были бы менее подвержены следующему:
class A
{
A(int myVariable_)
{
//<-- do something with _myVariable, oops _myVariable wasn't initialized yet
...
_myVariable = myVariable_;
}
int _myVariable;
};
Это могло также произойти с большими списками инициализации, и Вы используете _myVariable прежде, чем инициализировать его в списке инициализации.
В Cocoa вы редко (если вообще когда-либо) вызываете drawRect - вы просто помечаете область или представление как требующие обновления, и будет запланирована перерисовка. Это позволяет объединять перерисовки для нескольких недействительности.
Для Cocoa Touch требуется либо [view setNeedsDisplay] , либо setNeedsDisplayinRect: (CGRect)
Вам нужно вызвать [view setNeedsLayout], это должно привести к тому, что подпредставления получат вызов drawRect: при изменении макета. Однако я не проверял это.