#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 не могло увидеть его в файле библиотеки, пока этот проект не был скомпилирован.
Итак, исходя из этого и моих предыдущих интернет-исследований, я подведу итог тому, что я знаю о причинах этой ошибки:
- Отсутствует файл заголовка для класса, содержащего метод экземпляра
- Отсутствует реализация метода экземпляра
- Проект, содержащий заголовок с методом экземпляра, не был создан с момента добавления метода экземпляра. Эта ситуация также может возникнуть, только если вы отправляете сообщение для вызова метода экземпляра из отдельного проекта.
Я надеюсь, что это поможет всем, кто, как и я, часами в замешательстве смотрел на эту ошибку.