В чем разница между [myString length] и myString.length в target-c?

В настоящее время я изучаю Objective-C. Что именно означают квадратные скобки вокруг вещей и есть ли разница между их использованием и использованием точки (я из мира .NET, поэтому для меня это было бы проще).

Спасибо.


person Matt B    schedule 15.03.2012    source источник


Ответы (2)


Они оба делают одно и то же в вашем примере. . — это своего рода сокращение, используемое для доступа к свойству объекта. [] используются для отправки сообщения объекту. В вашем примере это одно и то же. Вы заметите разницу, если попытаетесь отправить сообщение, которое не связано напрямую с именем свойства.

Например: [myString length] и myString.length одинаковы, но если вы хотите установить длину (давайте предположим, что это имеет смысл для примера), вам нужно будет сделать что-то вроде [myString setLength:newLength] или myString.length = newLength. Кроме того, есть сообщения, которые не совпадают с именами свойств, как в этом примере:

[myString stringByReplacingOccurrencesOfString:@"hello" withString:@"world"];

который не имеет значимого эквивалента с использованием сокращения ..

person Carl Norum    schedule 15.03.2012
comment
Интересно, я мог бы поклясться, что компилятор использовал возможность отправлять сообщения без аргументов объектам с помощью оператора точки, даже если сообщение не отображалось на имя свойства. Не то, чтобы я когда-либо делал это, конечно... - person Matt Wilding; 16.03.2012
comment
Это возможно - я не пробовал. Хотя я бы не сказал, что это хорошая идея. Я определенно не хотел бы писать программу, основанную на таком поведении. - person Carl Norum; 16.03.2012
comment
@Carl: компилятор действительно это позволяет. Он не делает различий между свойством только для чтения и методом без параметров с правильным возвращаемым значением. В конце концов, геттер для свойства — это метод без параметров. В конце концов, myArray.count; действительно делает [myArray count];. - person Rudy Velthuis; 16.03.2012
comment
Да, это имеет смысл. Я просто думаю, что это странно - если бы указанный метод возвращал, например, void, вы бы видели код, подобный myObject.method;? Weeeeerd. - person Carl Norum; 16.03.2012

Objective-C использует сообщения, а не методы, и это основной синтаксис (точечный синтаксис был введен как альтернатива простым сообщениям get/set). Очевидно, что между методами и сообщениями есть существенные сходства, но также и различия.

В Objective-C объекты имеют полную гибкость в ответе на сообщение во время выполнения. Они могут обработать совершенно неожиданное сообщение, например, передав его другому объекту. Или вы можете делать такие вещи, как сопоставление сообщений со столбцами во время выполнения. Это основано на наследии, восходящем к Smalltalk.

Только .NET просто получил такую ​​гибкость благодаря dynamic/DynamicObject/IDynamicMetaObjectProvider. Конечно, в любом языке имена методов/сообщений, определенные во время компиляции, обычно более уместны. Но есть примечательные варианты использования динамических.

Конечно, Objective-C является надмножеством C, поэтому . используется для других вещей (обычно структур или объединений).

person Matthew Flaschen    schedule 15.03.2012