2010-10-28 4 views
2

Исходя из фона Java, я до сих пор не совсем понимаю семантику методов Objective-C, в отличие от их синтаксиса. Возьмем в качестве примера следующий метод:Семантика Objective-C методы

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 

Прост достаточно. Существует метод с именем numberOfSectionsInTableView, который принимает параметр UITableView и возвращает NSInteger. Теперь, как насчет этих методов:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

Как следует интерпретировать эти методы? Я наткнулся на три возможных объяснения:

1) Все три метода называются tableView, и они перегружены различными параметрами. Это кажется маловероятным, поскольку люди говорят о «вызове метода numberOfRowsInSection».

2) Методы названы numberOfRowsInSection, heightForRowAtIndexPath и cellForRowAtIndexPath, а Tableview является артефактом вследствие делегирования. В этом случае синтаксически означает, что таблица tableView? Если формат метода: '(return) name: parameters, где tableView подходит?

3) Поскольку Objective-C использует передачу сообщений, неправильно думать о методах. Скорее подумайте о передаче сообщений непосредственно объекту. Другими словами, если объект получает сообщения с именем tableView и numberOfRowsInSection, он знает, что выполняет определенную часть кода. Если это так, вопрос имеет значение? Проходит numberOfRowsInSection и Tableview так же, как проходя Tableview и numberOfRowsInSection?

ответ

3

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

- (void)foo;      // named 'foo' 
- (void)foo:(int)bar;    // named 'foo:' 
- (void)foo:(int)bar baz:(int)qux; // named 'foo:baz:' 

Обратите внимание на двоеточие в названии версии «Foo», который принимает параметр: Это очень важно. Количество параметров, которые принимает метод, является частью его имени. Это на самом деле строго определено, потому что порой в Objective-C вам нужно обратиться к полному селектору метода (используя директиву @selector). См. Раздел Selectors документа языка программирования Objective-C.

Кроме того, заказ является значительным. Эти два метода различны:

- (void)foo:(int)bar baz:(int)qux; // named 'foo:baz:' 
- (void)baz:(int)quz foo:(int)bar; // named 'baz:foo:' 

В Objective-C нет перегрузки. Компилятор не будет отправлять разные методы с тем же именем, но с разными типами параметров.

Ведущие tableView: в ваших примерах - это просто обычное соглашение об именах, используемое для делегатов; все делегаты-делегаты начнут с параметра, который указывает объект, который делегирует функциональность.

0

В Objective-C аргументы чередуются с именем метода (называемым «селектором»), а не передаются в виде списка в круглых скобках после имени. Полный селектор - это целая длинная вещь (tableView: numberOfRowaInSection :). Селектор разбивается на двоеточия, и здесь находятся аргументы. Для каждого двоеточия есть один аргумент. Селектор без каких-либо двоеточий означает метод, который не принимает никаких параметров.

1

В Objective-C имена методов называются signatures, и методы часто называются selectors.

Подпись четырех селекторов в вашем примере.

numberOfSectionsInTableView: 
tableView:numberOfRowsInSection: 
tableView:heightForRowAtIndexPath: 
tableView:cellForRowAtIndexPath: 

cellForRowAtIndexPath:tableView: не то же самое, как tableView:cellForRowAtIndexPath:

Там не может быть больше, чем один селектор с той же подписью в классе.

+0

Собственно, нет. В Objective-C имя метода является селектором. Методы называются «методами». Подпись относится к имени метода и типам аргументов. – JeremyP

+0

@JeremyP: подпись метода не знает имени метода – user102008

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