Как использовать метод самокласса на iPhone?(концептуальный вопрос)
-
03-07-2019 - |
Вопрос
Я пишу метод экземпляра в ClassName.m:
-(void)methodName:(paraType)parameter
{...}
И вызовите его, используя
[self methodName:parameter];
Появится предупреждение, но код по-прежнему работает успешно.
Это потому, что я не создал экземпляр класса?Почему метод по-прежнему работает нормально?И как правильно вызвать метод self, чтобы предотвратить появление предупреждения?
Решение
Ну, первым шагом к получению помощи с предупреждением будет публикация предупреждения :)
Я предполагаю, что это что-то о неопознанном сообщении?Если это так, то это потому, что, хотя компилятор и видит вызов «имя_метода», он не знает, действительно ли это для объекта или нет.
Я предполагаю, что ваш код выглядит так:
-(void) someFunc
{
...
[self methodName:parameter];
...
}
-(void)methodName:(paraType)parameter
{
...
}
Вы также можете;
а) Поместите функцию «имя_метода» раньше в файл, чтобы компилятор увидел ее до того, как она будет использована в вызовах.
б) объявить это в интерфейсе класса.Например.
// Foo.h
@interface Foo {
...
}
-(void) methodName:(paraType)parameter;
@end
Другие советы
Какое предупреждение вы получите?
Есть ли у вас определение метода в заголовочном файле?
Используемый вами синтаксис — это правильный способ вызова метода для себя.
Этот метод будет работать, поскольку методы Objective-C разрешаются во время выполнения.Я ожидаю, что вы получите предупреждение что-то вроде «Объект Foo может не ответить на -methodName:», а затем оно сообщит вам, что по умолчанию тип возвращаемого значения равен id
.Это потому, что компилятор не увидел объявления или определения -methodName:
к моменту компиляции кода, в котором вы его вызываете.Чтобы удалить предупреждение, объявите метод либо в интерфейсе класса, либо в категории класса.
Если вы получаете предупреждение, возможно, это связано с тем, что сигнатура метода отсутствует в интерфейсе.
@interface foo ....
-(void)method;
Как только реализация будет написана, предупреждение должно исчезнуть, поскольку компилятор видит этот метод не в первый раз.Без этого все будет работать, но предупреждающее сообщение раздражает.