Um dos principais comentários sobre esta pergunta pergunta especificamente:
Todas as respostas mencionam o mesmo tipo de idéia. Mas ninguém explica por que o Interface Builder parece funcionar da mesma maneira se você NÃO incluir o IBAction / IBOutlet em sua fonte. Existe outro motivo para o IBAction e o IBOutlet ou está correto deixá-los de fora?
Esta pergunta é respondida bem pelo NSHipster:
IBAction
https://nshipster.com/ibaction-iboutlet-iboutletcollection/#ibaction
Já em 2004 (e talvez antes), o IBAction não era mais necessário para que um método fosse percebido pelo Interface Builder. Qualquer método com a assinatura -(void){name}:(id)sender
seria visível no painel de saídas.
No entanto, muitos desenvolvedores acham útil ainda usar o tipo de retorno IBAction nas declarações do método para indicar que um método específico está conectado por uma ação. Mesmo projetos que não usam Storyboards / XIBs podem optar por empregar o IBAction para chamar métodos de destino / ação.
IBOutlet:
https://nshipster.com/ibaction-iboutlet-iboutletcollection/#iboutlet
Ao contrário do IBAction, o IBOutlet ainda é necessário para conectar propriedades no código a objetos em um Storyboard ou XIB.
Uma conexão IBOutlet geralmente é estabelecida entre uma visualização ou controle e seu controlador de visualização de gerenciamento (isso geralmente é feito além de quaisquer IBActions que um controlador de visualização possa ter como destino executar por um respondedor). No entanto, um IBOutlet também pode ser usado para expor uma propriedade de nível superior, como outro controlador ou uma propriedade que pode ser acessada por um controlador de exibição de referência.