2011-08-27 23 views
3

我試圖將NSCoding的方法從我的實際類中分離爲單獨的文件。我知道你通常可以在Objective-C中使用類別定義新方法,但似乎Xcode仍然在主類文件中沒有遇到-encodeWithCoder:和-initWithCoder:方法時發送警告。在主類的單獨.m文件中實現objc協議方法?

我這樣做的原因(並希望這聽起來不太複雜)是我有很多分散在各種文件中的類,爲了避免寫出encodeWithCoder的繁瑣冗餘:/ initWithCoder :爲每個類添加方法,我將一個小腳本放在一起,自動解析頭文件並根據變量類型生成必要的編碼/解碼代碼,並將結果轉儲到單個Encoders.m中。結果鏈接正常,但編譯期間仍然收到警告「類'MyClass'的未完成實現'」,'-initWithCoder:'找不到'的方法定義'(等),以及「Class'MyClass'未完全實現'NSCoding'協議「。我試着簡單地將聲明添加到類的.h文件中,但是沒有去。

有什麼辦法可以告訴Xcode這些方法實際上已經實現了,只是不在非Category類文件中?

簡化示例:

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

相關問題