2010-12-04 19 views

ответ

5

Существует на самом деле функциональная разница - вторая линия эквивалентна:

[[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, если у вас есть отвращение к точечному синтаксису.

0

Там нет никакой разницы, функционально; объектив C 2.0 только что представил точную нотацию, предоставив тем, кто не входит в скобки, выход.

EDIT:

Как сказано в комментариях отметил, конечно, это не так. Я отвечал на (непомеченный) вопрос: «В чем разница между [cmController currentPageNo]; и self.cmController.currentPageNo;

Nick's answer дает истинный ответ, который заключается в том, что первая строка непосредственно обращается к переменной, а вторая - к методу getter. Две строки также отличаются тем, что первая использует типичную запись в виде скобок, а вторая действительно использует новую точечную нотацию из объектива C 2.0.

+0

Это неверно. Пожалуйста, см. Ответы Стивена и Ника. – 2010-12-04 09:01:30

+0

Джо, Брэд, вы оба правы, конечно, это моя вина за попытку выбить быстрый ответ. Я сделаю быстрое редактирование, чтобы отразить это, и быть более прилежным. – 2010-12-04 15:34:23

3

Вообще, нотация точек - это просто синтаксический сахар.

Но в этом случае на самом деле есть какая-то разница.

[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.

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