«Традиционный» способ сделать это - с помощью протокола. Неофициальные использовались до того, как @protocol был добавлен к языку, но это было до моего времени и, по крайней мере, в последние несколько лет не приветствовались неофициальные протоколы, особенно с учетом спецификатора @optional. Что касается «делегата», который проходит два SEL, то это выглядит просто уродливее, чем объявление формального протокола, и, как правило, мне не кажется правильным. Блоки очень новые (особенно на iOS), и в то же время, пока мы еще не увидели огромный объем документации / блогов о наилучшем испытанном и истинном стиле, мне нравится идея, и это, кажется, одно из блоки вещей лучше всего подходят для: аккуратных новых структур потока управления.
По сути, я пытаюсь сказать, что каждый из этих методов различается по возрасту, и ни один из них не лучше, чем последний, за исключением стиля, который, очевидно, имеет огромное значение, и в конечном итоге именно поэтому был создан каждый из этих элементов. , По сути, воспользуйтесь новейшей вещью, которая вас устраивает, которая должна быть либо блоками, либо формальным протоколом, и что ваша путаница, скорее всего, связана с чтением противоречивых источников, поскольку они были написаны в разное время, но с точки зрения времени это ясно видно, что вытесняет другие.
[Controller askForSelection:^(id selection){
//blah blah blah
} canceled:^{
//blah blah blah
}];
, вероятно, чертовски лаконичнее, чем определение двух дополнительных методов и протокола для них (формально или иным образом) или передача SEL и сохранение их в ivars и т. Д.