アクセシビリティ API を使用していくつかの UI タスクを自動化することを考えていますが、アクセシビリティ オブジェクトの階層を下るコードを記述するには多くのコードが必要であり、CFRelease() を呼び出すのを忘れると偶発的なメモリ リークが発生しやすいことがわかりました。たとえばAXSplitGroup
、アクセシビリティ オブジェクトの子を探すために私が書いたコードを次に示します。
//AXError axErr;
//CFTypeRef typeRef;
AXUIElementRef axSplitGroup = NULL;
{
CFIndex objectChildrenCount;
axErr = AXUIElementGetAttributeValueCount(axObject, kAXChildrenAttribute, &objectChildrenCount);
assert(kAXErrorSuccess == axErr);
CFArrayRef objectChildren;
axErr = AXUIElementCopyAttributeValues(axObject, kAXChildrenAttribute, 0, objectChildrenCount, &objectChildren);
assert(kAXErrorSuccess == axErr);
assert(CFArrayGetCount(objectChildren) == objectChildrenCount);
for (CFIndex i = 0; i < objectChildrenCount; ++i) {
AXUIElementRef objectChild = CFArrayGetValueAtIndex(objectChildren, i);
axErr = AXUIElementCopyAttributeValue(objectChild, kAXRoleAttribute, &typeRef);
assert(kAXErrorSuccess == axErr);
assert([(__bridge id)typeRef isKindOfClass:[NSString class]]);
CFStringRef role = (CFStringRef)typeRef;
if (kCFCompareEqualTo == CFStringCompare(role, kAXSplitGroupRole, 0)) {
axSplitGroup = objectChild;
i = objectChildrenCount - 1;
}
CFRelease(role);
}
CFRelease(objectChildren);
assert(axSplitGroup);
}
もともと私は、関心のあるアクセシビリティ オブジェクトを取得するために、XPath のような式をアクセシビリティ オブジェクト階層で評価できるようにする API を Apple が提供しているのではないかと思っていました (読み: 期待しています)。これは存在します。
コードをあまり使わずにアクセシビリティ オブジェクト階層を反復するために使用できる別の標準 API はありますか?