iPhone - разница между этими двумя строками кода - PullRequest
1 голос
/ 04 декабря 2010

Какая разница между этими двумя строками кода:

[cmController currentPageNo];
self.cmController.currentPageNo;

Ответы [ 3 ]

5 голосов
/ 04 декабря 2010

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

[[self cmController] currentPageNo];

Использование метода получения свойства -cmController для доступа к cmController ivar может иметь поведение, отличающее его от доступаивар напрямую.Они могут включать в себя ленивую инициализацию или атомарную блокировку потока, или ряд других действий.Если у вас нет веских причин, вам следует (в общем) использовать методы доступа к свойствам, а не прямой доступ к ivars.

Итак, чтобы уточнить:функционально идентичны друг другу, но используют другой синтаксис.3 и 4 также функционально идентичны друг другу, но используют другой синтаксис.Вы должны использовать версию 4 или версию 3, если у вас есть отвращение к точечному синтаксису.

3 голосов
/ 04 декабря 2010

Обычно точечная запись - это просто синтаксический сахар.

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

[cmController currentPageNo];

Это будет использовать переменную экземпляра класса напрямую для получения вашего cmController. Затем он отправит currentPageNo на него.

self.cmController.currentPageNo;

Это, с другой стороны, будет использовать определение свойства текущего класса, чтобы получить cmController через ivar класса.

Это означает, что, в основном, первое немного более эффективно, чем второе. Не потому, что вы использовали точечную запись, а потому, что вы использовали cmController напрямую, а не self.cmController. [whatever currentPageNo] совпадает с whatever.currentPageNo.

Эти строки эквивалентны, за исключением используемого синтаксиса:

[cmController currentPageNo];
cmController.currentPageNo;

С другой стороны, эти строки эквивалентны, за исключением используемого синтаксиса:

self.cmController.currentPageNo;
[[self cmController] currentPageNo];

Надеюсь, это понятно.

Вы можете прочитать о точечной нотации здесь .

0 голосов
/ 04 декабря 2010

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

РЕДАКТИРОВАТЬ:

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

Ответ Ника дает верный ответ: первая строка напрямуюобращается к переменной, в то время как вторая строка использует метод получения переменной.Эти две линии также отличаются тем, что первая использует типичные обозначения в скобках, а вторая действительно использует новую точечную запись из цели C 2.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...