Что такое разностного между этими двумя строками кода:iPhone - разница между этими двумя строками кода
[cmController currentPageNo];
self.cmController.currentPageNo;
Что такое разностного между этими двумя строками кода:iPhone - разница между этими двумя строками кода
[cmController currentPageNo];
self.cmController.currentPageNo;
Существует на самом деле функциональная разница - вторая линия эквивалентна:
[[self cmController] currentPageNo];
Используя метод получения -cmController
свойства для доступа к cmController
Ивар может иметь поведение, которое делает его отличным для доступа к Ивар непосредственно. Они могут включать в себя ленивую инициализацию или блокировку атомной нити или ряд других способов поведения. Если у вас нет веских оснований, вы должны (в общем) использовать методы доступа для свойств, а не напрямую обращаться к ivars.
Так уточнить:
[cmController currentPageNo]; // 1
cmController.currentPageNo; // 2
[[self cmController] currentPageNo]; // 3
self.cmController.currentPageNo; // 4
1 и 2 функционально идентичны друг другу, но и использовать другой синтаксис.3 и 4 также функционально идентичны друг другу, но используют различный синтаксис. Вы должны использовать версию 4 или версию 3, если у вас есть отвращение к точечному синтаксису.
Там нет никакой разницы, функционально; объектив C 2.0 только что представил точную нотацию, предоставив тем, кто не входит в скобки, выход.
EDIT:
Как сказано в комментариях отметил, конечно, это не так. Я отвечал на (непомеченный) вопрос: «В чем разница между [cmController currentPageNo];
и self.cmController.currentPageNo;
?»
Nick's answer дает истинный ответ, который заключается в том, что первая строка непосредственно обращается к переменной, а вторая - к методу getter. Две строки также отличаются тем, что первая использует типичную запись в виде скобок, а вторая действительно использует новую точечную нотацию из объектива C 2.0.
Вообще, нотация точек - это просто синтаксический сахар.
Но в этом случае на самом деле есть какая-то разница.
[cmController currentPageNo];
Это будет использовать переменную экземпляра класса напрямую, чтобы получить ваш cmController. Затем он отправит currentPageNo.
self.cmController.currentPageNo;
Это, с другой стороны, будет использовать определение свойства текущего класса, чтобы получить cmController через Ивар класса.
Это означает, что, в основном, первое немного более эффективно, чем второе. Не потому, что вы использовали точечную нотацию, а потому, что вы использовали cmController напрямую, а не self.cmController
. [whatever currentPageNo]
- это то же самое, что и у whatever.currentPageNo
.
Эти строки эквивалентны для синтаксиса, используемого за исключением:
[cmController currentPageNo];
cmController.currentPageNo;
С другой стороны, эти строки эквивалентны для синтаксиса, используемого за исключением:
self.cmController.currentPageNo;
[[self cmController] currentPageNo];
Я надеюсь, что это ясно.
Вы можете прочитать о dot нотации here.
Это неверно. Пожалуйста, см. Ответы Стивена и Ника. – 2010-12-04 09:01:30
Джо, Брэд, вы оба правы, конечно, это моя вина за попытку выбить быстрый ответ. Я сделаю быстрое редактирование, чтобы отразить это, и быть более прилежным. – 2010-12-04 15:34:23