Реализация методов протокола objc в отдельном файле .m из основного класса? - PullRequest
3 голосов
/ 27 августа 2011

Я пытаюсь отделить методы для NSCoding в отдельные файлы от моих реальных классов.Я знаю, что вы обычно можете определять новые методы, используя Категории в Objective-C, но кажется, что XCode все еще отправляет предупреждения, когда он не сталкивается с методами -encodeWithCoder: и -initWithCoder: в файле мастер-класса.

Причина, по которой я это делаю (и, надеюсь, это звучит не слишком запутанно), заключается в том, что у меня много десятков классов, разбросанных по разным файлам, и чтобы избежать утомительности и избыточности при записи метода encodeWithCoder: / initWithCoder:В каждом классе я собирал небольшой скрипт, который автоматически анализировал заголовочные файлы и генерировал необходимый код кодирования / декодирования на основе типов переменных и выводил результаты в один Encoders.m.Результат связывается должным образом, но я все еще получаю предупреждения во время компиляции «Неполная реализация класса« MyClass »», «Определение метода для -initWithCoder:« not found »(и т. Д.), А« Класс «MyClass» не полностью реализуетПротокол NSCoding.Я попытался просто добавить декларации в файлы классов .h, но ничего не получилось.

Есть ли способ сообщить XCode, что методы на самом деле реализованы, но не в файле класса, не относящемся к категории?

Упрощенный пример:

MyClass.h

@interface MyClass : NSObject <NSCoding> {
    int num;              //@ENCODABLE
    float timer;          //@ENCODABLE
    SomeOtherClass *obj;  //@ENCODABLE
}
...
@end

MyClass.m

#import "MyClass.h"
@implementation MyClass
...
@end

Encoders.m

#import "MyClass.h"
@implementation MyClass (Encoding)
-(void) encodeWithCoder:(NSCoder*)encoder {
    // Auto-generated encoding of instance variables
}
-(id) initWithCoder:(NSCoder*)decoder {
    if (self = [self init]) {
        // Auto-generated decoding of instance-variables
    }
    return self;
}
@end

1 Ответ

3 голосов
/ 27 августа 2011

Любые методы, которые объявлены в интерфейсе класса, расширении класса или протоколе, который указывается либо интерфейсом, либо расширением, должны быть реализованы в основном блоке @implementation, иначе вы получите предупреждение. Нет способа объявить метод в этих местах и ​​сообщить компилятору, что он будет в категории. Что вы можете сделать, это создать интерфейс категории и объявить там протокол NSCoding. Если вы добавите этот интерфейс в ваш основной файл заголовка, любые файлы, которые импортируют заголовок, будут знать, что класс поддерживает кодирование, но компилятор не будет жаловаться, что методы не реализованы.

Новый MyClass.m

@interface MyClass : NSObject {
    int num;              //@ENCODABLE
    float timer;          //@ENCODABLE
    SomeOtherClass *obj;  //@ENCODABLE
}
...
@end
@interface MyClass (Encoding) <NSCoding>
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...