Как мне решить ошибки «Метод экземпляра […] не найден»?

#objective-c #macos #cocoa #selector

#objective-c #macos #cocoa #селектор

Вопрос:

Я разрабатываю приложение Cocoa. Насколько я могу судить, я все делаю правильно при попытке вызвать метод в селекторе. Например (абстрагированный):

Header.h

 @interface Foo

@property (nonatomic) BOOL variable;

- (void)bar;

@end
  

Header.m

 #import "Header.h"

@implementation Foo

@synthesize variable;

- (void)bar
{
    NSLog("Test");
}

@end
  

OtherHeader.m

 #import "Header.h"

@implementation OtherFoo

- (IBAction)otherBar:(id)sender
{
    Foo *foo = [sender representedObject];
    [foo bar]; // Generates warning
    BOOL variable = [foo variable]; // No warning
}

@end
  

Когда я делаю это, выражение [foo bar] получает предупреждение «Метод экземпляра»-bar» не найден (возвращаемый тип по умолчанию равен ‘id’).

Я понимаю, что подобные вопросы часто задавались в SO, но я тщательно просмотрел их (и документацию для cocoa и селекторов), и ничто не помогло. Наиболее распространенными причинами этой ошибки, по-видимому, является отсутствие реализации bar или ссылки на Header.h, но, как вы можете видеть, у меня есть и то, и другое.

РЕДАКТИРОВАТЬ: селектор вызывается из экземпляра NSMenuItem — вот почему я вызываю representedObject .

ПРАВКА 2: По какой-то причине другие методы и свойства экземпляра не выдают предупреждение. Только конкретные методы экземпляра. Так странно.

Комментарии:

1. Что произойдет, если вы сделаете: Foo *foo = (Foo *)[sender representedObject]; ?

2. К сожалению, то же самое происходит при использовании приведения в стиле C. Тем не менее, хорошая идея.

3. Почему вы вызываете representedObject ? И где документация для этого метода …?

4. Извините, я думаю, мне следовало упомянуть, что селектор вызывается из экземпляра NSMenuItem

5. Что, если бы вы изменили метод на - (IBAction)otherBar:(NSMenuItem *)sender ?

Ответ №1:

Вау. Я идиот. Эта проблема была вызвана тем, что я не создал его. Поскольку OtherHeader.h был в отдельном проекте, автозаполнение XCode не могло увидеть его в файле библиотеки, пока этот проект не был скомпилирован.

Итак, исходя из этого и моих предыдущих интернет-исследований, я подведу итог тому, что я знаю о причинах этой ошибки:

  1. Отсутствует файл заголовка для класса, содержащего метод экземпляра
  2. Отсутствует реализация метода экземпляра
  3. Проект, содержащий заголовок с методом экземпляра, не был создан с момента добавления метода экземпляра. Эта ситуация также может возникнуть, только если вы отправляете сообщение для вызова метода экземпляра из отдельного проекта.

Я надеюсь, что это поможет всем, кто, как и я, часами в замешательстве смотрел на эту ошибку.