問題
この質問は少し長いように思えるかもしれませんが、私はこれに本当に驚いているので、できるだけ多くの情報を提供しようとしています.
私は現在、XML ドキュメントの解析を自動化するライブラリに取り組んでいます。しかし、ライブラリを初めてテストしているときに問題が発生しています。
CSXDocumentLayout
ドキュメントのレイアウトを表すというライブラリ クラスがあります。- (NSError *)readLayoutDocument:(NSString *)fpath
このクラスには、init メソッドから呼び出されるプライベート メソッドが含まれます。
/* MARK: Reading in Layouts */
- (NSError *)readLayoutDocument:(NSString *)fpath {
CSXDocumentLayout *layout;
CSXXMLParser *parser;
BOOL state;
layout = [CSXDocumentLayout layoutDocumentLayout];
parser = [[CSXXMLParser alloc] initWithDocumentLayouts:
[NSArray arrayWithObject:layout]];
parser.file = fpath;
state = [parser parse];
if(state == NO || parser.error != nil) {
return parser.error;
}
return nil;
}
このメソッドは、他の XML ドキュメントのレイアウトを表す XML ドキュメントを読み取ります。CSXXMLParser
テストしたいクラスによって解析されます。
でレイアウト ドキュメントを表すオブジェクトを作成します+[CSXDocumentLayout layoutDocumentLayout]
。このメソッドは、カテゴリで実装されていますCSXDocumentLayout (CSXLayoutObject)
。
以下は私のテストファイルです:
#import <Foundation/Foundation.h>
#import <CeasyXML.h>
int main(int argc, const char **argv) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSString *file;
file = [NSString stringWithUTF8String:__FILE__];
file = [file stringByDeletingLastPathComponent];
file = [file stringByAppendingPathComponent:@"Layout.xml"];
CSXDocumentLayout *layout;
NSError *error;
layout = [[CSXDocumentLayout alloc] initWithLayoutDocument:file
error:&error];
if(layout == nil) {
NSLog(@"Could not create layout: %@", error);
exit(0);
}
NSLog(@"Layout:\n%@", layout);
[pool release];
return 0;
}
このファイルは、スタティック ライブラリlibceasyxml.aにリンクされた別の実行可能ファイルにコンパイルされます。すべてが警告なしで問題なくコンパイルされます。
しかし、実行すると、認識されないセレクターがクラス例外に送信されます。
2012-05-02 16:59:47.620 TestApp[1887:a0f] +[CSXDocumentLayout layoutDocumentLayout]: unrecognized selector sent to class 0x1000064c8
2012-05-02 16:59:47.791 TestApp[1887:a0f] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[CSXDocumentLayout layoutDocumentLayout]: unrecognized selector sent to class 0x1000064c8'
*** Call stack at first throw:
(
0 CoreFoundation 0x00007fff83e47784 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff84604f03 objc_exception_throw + 45
2 CoreFoundation 0x00007fff83ea11a0 __CFFullMethodName + 0
3 CoreFoundation 0x00007fff83e198ef ___forwarding___ + 751
4 CoreFoundation 0x00007fff83e15a38 _CF_forwarding_prep_0 + 232
5 TestApp 0x0000000100001512 -[CSXDocumentLayout(Private) readLayoutDocument:] + 49
6 TestApp 0x00000001000010d4 -[CSXDocumentLayout initWithLayoutDocument:error:] + 96
7 TestApp 0x0000000100001017 main + 179
8 TestApp 0x0000000100000f5c start + 52
9 ??? 0x0000000000000001 0x0 + 1
)
+[CSXDocumentLayout(CSXLayoutObject) layoutDocumentLayout]
と の両方を呼び出すことはできますが、クラス メソッド を-[CSXDocumentLayout initWithLayoutDocument:error:]
呼び出すことができないのは非常に気がかりです-[CSXDocumentLayout(Private) readLayoutDocument:]
。
リサーチ
実行して出力ファイルでメソッドが定義されているかどうかを確認しましたnm file
が、部分的には次のとおりです。
libceasyxml.a では、それが定義されています(nm libceasyxml.a)
...
libceasyxml.a(CSXDocumentLayout+CSXLayoutObject.o):
0000000000000100 t +[CSXDocumentLayout(CSXLayoutObject) classAttributeLayout]
00000000000020e0 s +[CSXDocumentLayout(CSXLayoutObject) classAttributeLayout].eh
000000000000056b t +[CSXDocumentLayout(CSXLayoutObject) documentElementLayout]
0000000000002180 s +[CSXDocumentLayout(CSXLayoutObject) documentElementLayout].eh
0000000000000402 t +[CSXDocumentLayout(CSXLayoutObject) layoutDocumentLayout]
0000000000002148 s +[CSXDocumentLayout(CSXLayoutObject) layoutDocumentLayout].eh
0000000000000200 t +[CSXDocumentLayout(CSXLayoutObject) layoutElementLayout]
0000000000002110 s +[CSXDocumentLayout(CSXLayoutObject) layoutElementLayout].eh
0000000000000000 t +[CSXDocumentLayout(CSXLayoutObject) nameAttributeLayout]
00000000000020b0 s +[CSXDocumentLayout(CSXLayoutObject) nameAttributeLayout].eh
0000000000002098 s EH_frame1
0000000000001c49 s LC0
...
TestAppでは定義されていません(nm TestApp)、実際にはカテゴリ名のメソッドが見つかりませんCSXLayoutObject
。
...
0000000100001271 t -[CSXDocumentLayout setDocumentClassString:]
00000001000013a8 t -[CSXDocumentLayout setElements:]
0000000100001490 t -[CSXDocumentLayout setName:]
00000001000014db t -[CSXDocumentLayout(Private) readLayoutDocument:]
0000000100004060 t -[CSXElementList dealloc]
00000001000040b0 t -[CSXElementList elements]
...