私はココアに少し慣れていないので、ここでりんごの例に従いました: Open Directory プログラミングガイド
この例では、retain を使用して ODQuery オブジェクトを取得していますが、これはもはや許可されておらず、参照をそのままにしておくようにコンパイラに指示する他の方法が見つかりません。私が理解しているように、 alloc もそれを行いません。
ODQuery が NSRunLoop に渡されると、参照が失われたように見えます。NSRunLoop はそれを query:foundResults:error に渡す必要があります。
コードは次のとおりです (私のコンピューターと同じ名前のグループを探す必要があります)。
NSString *computer = [[NSHost currentHost] localizedName];
NSError *err;
ODQuery *aQuery = [[ODQuery alloc] initWithNode:adNode
forRecordTypes:kODRecordTypeGroups
attribute:kODAttributeTypeRecordName
matchType:kODMatchBeginsWith
queryValues:computer
returnAttributes:kODAttributeTypeStandardOnly
maximumResults:0
error:&err];
[aQuery setDelegate:self];
[aQuery scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
adNode と session をプライベート変数として割り当て、init メソッドで割り当てます。
NSError *err;
NSString *nodeName = @"/Active Directory/GU/gu.gu.se";
theSession = [ODSession defaultSession];
adNode = [ODNode nodeWithSession:theSession name:nodeName error:&err];
NSLog(@"Error from initWorker: %@", [err localizedDescription]);
メソッド query:foundResults:error をオーバーライドして、プロトコル ODQueryDelegate を実装しました。NSRunLoop から呼び出されると、ポインター エラーが原因でプログラムがクラッシュします。
- (void)query:(ODQuery *)inQuery foundResults:(NSArray *)inResults error:(NSError *)inError
誰かが助けてくれることを願っています。