2013-04-19 2 views
0

Что означают эти линии?Объяснение выражения Objective-c

for(ContactInfo *item in fullContactsArray) { 
     if(item->contactId || item->listId) 
      [contactsArray addObject:item]; 
    } 

В частности, я хочу знать, что означает ->. Пожалуйста помоги.

+1

http://www.cs.ftware.narod.ru/CstftwareDev/C/CStructs.htm – bryanmac

+2

... и это зависит от знания того, что исторически классы Objective-C представляли собой структуры со всеми переменными экземпляра внутри них , Они не находятся в современной среде исполнения - есть дополнительный уровень косвенности, чтобы отрицать проблему хрупкого базового класса и позволять добавлять свойства во время выполнения, но синтаксис переносится вперед. – Tommy

ответ

3

При работе с указателями на типы данных на основе структуры специальный синтаксис разыменования позволяет вам отмечать указатель и получать доступ к определенному полю внутри структуры за один шаг. Для этого мы используем оператор ->, как показано ниже:

struct box * p = ...; 
p->width = 20; 

оператор -> продемонстрировал на второй линии разыменовывает указатель р, а затем получает доступ к ширине поля в структуре. Следуя указателю на чтение или изменение значения, на которое он указывает, иногда полезно сравнить два указателя, чтобы проверить, указывают ли они одинаковые значения.

Pointers in Objective-C

+2

Оператор '->' работает также для доступа к ivars в классах Objective-C, а не только C-structs. Фактически, в вопросе «ContactInfo» является классом Objective-C, а не C-struct. – rmaddy

+1

В этом случае это была бы очень редкая птица, класс Objective-C с переменными public instance. – matt

+1

@matt Не обязательно. Если этот код находится в классе 'ContactInfo', ivar может быть закрытым. – rmaddy

2

-> оператор работает точно так же, как и в C или C++ ... item->contactId такая же, как (*item).contactId. (Точка в данном случае является оператор доступа членом, а не оператор доступа свойства.)

  • Цикла for является примером быстрой итерации через контейнер Objective-C. Он просто анализирует каждый объект в массиве fullContactsArray, назначая каждый объект в свою очередь переменной цикла item.

  • item является указателем на объект типа ContactInfo, и каждый раз через цикл он указывает на другой объект. Оператор if использует оператор -> для проверки значений переменных экземпляра и listId.

  • Если какая-либо из этих переменных отлична от нуля, объект, который указывает item, добавляется к contactsArray.

Это немного необычно видеть -> в коде Objective-C, особенно в эти дни, так как свойства и аксессоров собственности часто предпочитают прямой доступ к переменной экземпляра.

+0

Большое спасибо, именно то, что я хотел знать! – PAcan

+2

@Caleb Извините. Отрекался. Я должен был проверить это, прежде чем я сделал заявление. Я никогда не видел, чтобы это использовалось ранее с ссылками Objective-C ivar. Но вы правы. Это действительно работает. – rmaddy

+0

@rmaddy Не стоит беспокоиться. Как я уже сказал, это не часто видно в Objective-C. Одна вещь, которую я * очень * ненавижу видеть, это код, например, self-> ivar'. A) Вы можете просто сказать «ivar», нет необходимости в 'self->' part.И B), если вы собираетесь использовать 'self', вы также можете сделать это' self.ivar' и превратить 'ivar' в свойство. – Caleb

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