Вызов метода с типом возврата «void» в том же файле - PullRequest
3 голосов
/ 11 апреля 2011

У меня простой вопрос.

В Objective-C, когда у вас есть метод, который вы хотите вызвать, с типом возврата void, как вы вызываете его из другого метода?

То, как я делал это в своем приложении, таково:

[self nameOfMethod];

Но это заставляет Xcode выплевывать следующую ошибку:

Method '-nameOfMethod' not found (return type defaults to 'id')

Хотя, похоже, все еще выполняется.

Я правильно это называю или есть лучший способ?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 11 апреля 2011

Я предполагаю, что вы не объявили -nameOfMethod в интерфейсе класса, и вы вызываете его из другого метода, реализация которого предшествует реализации -nameOfMethod, то есть:

- (void)someMethod {
    [self nameOfMethod];
}

- (void)nameOfMethod {
    // …
}

Когдакомпилятор анализирует -someMethod и -nameOfMethod не был объявлен в интерфейсе класса, он генерирует предупреждение, потому что он еще не знает о -nameOfMethod.

По сути, есть два решения для этого,Вы можете изменить порядок файлов реализации так, чтобы -nameOfMethod появлялся перед -someMethod, но это не всегда возможно.Лучшее решение - объявить -nameOfMethod в интерфейсе класса.Если предполагается, что клиенты вашего класса будут вызывать -nameOfMethod, поместите его в соответствующий заголовочный файл.С другой стороны, если предполагается, что -nameOfMethod вызывается только внутри вашего файла реализации, используйте расширение класса.Предположим, что ваш класс называется SomeClass, вот как будут выглядеть ваши заголовочные файлы и файлы реализации:

// SomeClass.h
@interface SomeClass : NSObject {
    // … instance variables
}

// … external methods
- (void)someMethod;
@end

// SomeClass.m
#import "SomeClass.h"

@interface SomeClass () // this is a class extension
// … internal methods
- (void)nameOfMethod;
@end

@implementation SomeClass
- (void)someMethod {
    [self nameOfMethod];
}

- (void)nameOfMethod {
    // …
}
@end

При использовании расширений классов порядок реализации методов не будет иметь значения.

1 голос
/ 11 апреля 2011

Вы называете это правильно, но убедитесь, что интерфейс вашего (void) метода находится в вашем .h файле.

1 голос
/ 11 апреля 2011

Вы должны убедиться, что ваш интерфейсный файл содержит определение nameOfMethod - так;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...