2011-08-27 7 views
3

NSCodingのメソッドを実際のクラスから別々のファイルに分割しようとしています。 Objective-Cでカテゴリを使用して新しいメソッドを定義することは一般的にはわかっていますが、マスタクラスファイルの-encodeWithCoder:および-initWithCoder:メソッドが見つからない場合でも警告が送信されるようです。メインクラスとは別の.mファイルにobjcプロトコルメソッドを実装していますか?

私がこれをやっている理由は(そしてうまくいけばそれほど複雑ではない)というのは、私はさまざまなファイルにまたがって数十のクラスが広がっていて、encodeWithCoder:/ initWithCoder :それぞれのクラスごとにメソッドを作成し、ヘッダーファイルを自動的に解析し、変数型に基づいて必要なエンコード/デコードコードを生成し、結果を単一のEncoders.mにダンプするための小さなスクリプトをまとめました。結果は正しくリンクされていますが、コンパイル時に警告が表示されます。 "クラス 'MyClass'の実装が不完全で、 '-initWithCoder:'が見つかりませんでした '(など)、"クラス' 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 

答えて

3

クラスのインターフェイス、クラスの拡張子、またはインターフェイスまたは拡張子で指定されたプロトコルで宣言されているメソッドはすべて、メインの@implementationブロックに実装する必要があります。そうしないと警告が表示されます。それらの場所にメソッドを宣言し、それがカテゴリになることをコンパイラに伝える方法はありません。あなたができることは、カテゴリのインターフェイスを作成し、そこにNSCodingプロトコルを宣言することです。このインターフェイスをメインヘッダーファイルに追加すると、ヘッダーをインポートするすべてのファイルでクラスがコーディングをサポートしていることがわかりますが、コンパイラはメソッドが実装されていないと不平を言うことはありません。完璧に動作

新MyClass.m

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

、ありがとう! – ccjuju

関連する問題