2013-06-20 2 views
2

Я учусь Objective-C, и как часть моего обучения я пытаюсь преобразовать точечную нотацию, где я вижу его, обратно кронштейн нотации (я предпочитаю кронштейн обозначения сейчас)Понимание Objective-C точечная нотация

Итак, мой текущий взгляд на мир:

  1. Объектив-c до 2.0 имеет точечную нотацию только для структур.
  2. Objective-c 2.0 введенная точка для свойств. Это позволяет получить доступ к сеттерам/геттерам через точечную нотацию?
  3. Сообщения не могут быть отправлены структурам?

В книге, которую я читаю, я прошел через приведенный ниже код, и при первых моих попытках я неудачно пропустил преобразование в скобки.

... 
CGRect switchViewFrame = switchView.frame; 
switchViewFrame.origin.y += [UIApplication sharedApplication].statusBarFrame.size.height; 

Выкопав немного глубже, я пришел к следующим выводам ...

  1. switchViewFrame.origin.y не могут быть преобразованы в скобки обозначения, поскольку switchViewFrame определяется как CGRect, который структура в документации на яблоки, поэтому необходимо использовать точечную нотацию?

  2. rvalue на второй строке представляет собой комбинацию скобок и точек, потому что shareApplication - это метод класса UIApplication, и поэтому отправляется сообщение, но statusBarFrame определяется как свойство CGRect, то есть структурной и поэтому точечной нотации необходимо?

Любая помощь, чтобы прояснить эти пункты была бы очень признательна.

Если я полностью неправильно понял, и вы действительно можете преобразовать его в скобки нотации, не могли бы вы объяснить, почему.

Благодаря

ответ

1

1) Цель-с до 2.0 имел точечную нотацию только для сравнения структур? Да, насколько я знаю.
2) Objective-c 2.0 введенная точка для свойств. Это позволяет получить доступ к сеттерам/геттерам через точечную нотацию? Да.
3) Сообщения не могут быть отправлены в структуры? Правильно, отправка сообщения эквивалентна вызову метода в объекте, к которому отправлено сообщение.
4) switchViewFrame.origin.y не могут быть преобразованы в скобки обозначения, поскольку switchViewFrame определяется как CGRect, который находится в документации яблоки struct, поэтому точка обозначения необходимо? Да.
5) rvalue на второй линии представляет собой комбинацию из скобок и точек, так как shareApplication представляет собой метод класса UIApplication, и, следовательно, сообщение посылается, но statusBarFrame определяется как свойство CGRect т.е. struct и, следовательно, точечной нотации необходимо? No: statusBarFrame является собственностью объекта UIApplication. Но statusBarFrame - это struct с компонентами origin и size, которые также являются structs.
Итак, вы были почти везде правы.

+2

Чтобы уточнить №5. Код может быть записан как '[[UIApplication sharedApplication] statusBarFrame] .size.height;'. Доступ к значению свойства тот же (фактически он переводится) на вызов соответствующего метода «getter». – rmaddy

+1

Чтобы уточнить # 1; это не «точечное обозначение для структур». Это просто доступ к структуре таким образом, который всегда имел C. Эти два полностью ортогональны (поэтому мы стандартизировали на *, не используя точечную нотацию в любом месте *). – bbum

+0

@bbum: в стороне - кто мы? Единица в Apple? Я понимаю, что точечная нотация выходит из употребления там (на основе материалов, покрытых NDA). – Cris

0

https://stackoverflow.com/a/10444012/2449268

Объясняется это очень хорошо, надеюсь, что это ответ на ваш вопрос.

Также можно использовать кронштейн обозначения на раме, как показано ниже:

CGRect switchViewFrame = switchView.frame; switchViewFrame.origin.y + = [[UAppication sharedApplication] statusBarFrame] .size.height;