Programar para iOS é uma questão de saber onde colocar as coisas. Por isto existe o paradigma do MVC.
Vamos aos princípios. IBAction é apenas uma sinalização para o Interface Builder, por isso IB, de que alí é um Target-action. Isso facilita na hora de fazer as conexões visualmente no construtor de interfaces.
IBAction é um typedef para void. Não retorna nada.
No modelo MVC as únicas duas formas que seu view tem de comunicar de volta com o controller é via DELEGATE ou via TARGET-ACTION. Só. Qualquer apontamento direto para o controller é violar o MVC. Não queria jamais fazer isso, senão vc vai falhar rápido.
Se você quer executar este método diretamente e ele é um IBAction, certifique-se primeiramente ele é um VIEW, como um botão(UIButton), slider (UISlider), etc.
Chamar um IBAction por algo que não seja um VIEW é um erro de semântica e é errado.
Se você tiver um VIEW e deseja chamar a função, use o método correto, que é o mesmo que o IB cria pra você quando você cria as conexões visualmente:
- (void)addTarget:(id)target forAction:(SEL)selector forControlEvents:(UIControlEvents)controlEvents;
Target: seu controller, ou quem é responsável por executar o selector, geralmente self.
Selector: o método IBAction, chamado por @selector(metodo)
controlEvents: o tipo de evento que será disparado, existem vários. Use o que melhor encaixa em sua necessidade.
Sobre o "id", ele é simplesmente um ponteiro para um objeto. Seu uso NÃO é desencorajado pela Apple e tem uma utilidade incrível. Ele quer dizer "vou receber qualquer objeto como parâmetro".
O que a documentação diz é que você deve saber o que está fazendo ao usar id, pois se você enviar uma mensagem para um objeto que não responde a determinado metodo, seu app trava. A melhor alternativa é usar introspecção, que é perguntar se o objeto pertence a determinada classe: [obj isKindOfClass:].
No seu caso, se deseja chamar o metodo por umboleto que não seja um View,não use um IBAction, use um metodo normal:
- (void)metodo:parametro1:parametro2
... E dentro do seu IBAction você chama o mesmo método:
- (IBAction) metodo:(id)sender{
[self metodo];
}
É tudo uma questão de design da sua classe.
Mas tenha em mente o seguinte: não viole o MVC, use IBActions só para Views e se for usar id use introspecção para verificar se o que você enviou responde ao método.
Espero ter ajudado!
Abraço.