首页 > 解决方案 > 从 CSIdentity 转换为与 C 兼容的字符串

问题描述

介绍

我有一个objective-C文件(.m),我试图在其中查询本地用户(通过CSGetLocalIdentityAuthority然后通过printf(有意使用C)打印每个用户)。

我期待什么?

用目标 c 获取本地用户,用 C pritnf 打印它们。

这是我的尝试:

主文件

int main(){
    // Query Local Identity Authority
    CSIdentityAuthorityRef defaultAuthority = CSGetLocalIdentityAuthority();
    CSIdentityClass identityClass = kCSIdentityClassUser;
    CSIdentityQueryRef query = CSIdentityQueryCreate(NULL, identityClass, defaultAuthority);
    CFErrorRef error = NULL;
    CSIdentityQueryExecute(query, 0, &error);

    // get query results
    CFArrayRef users_queried = CSIdentityQueryCopyResults(query);

    //iterate over users
    // Create a users array
    NSMutableArray * users_list = [NSMutableArray array];
    // // number of users
    int users_queried_count = CFArrayGetCount(users_queried);
    
    // // iterate users and save to users array
    for (int i = 0; i < users_queried_count; ++i) {
        CSIdentityRef identity = (CSIdentityRef)CFArrayGetValueAtIndex(users_queried, i);
        CBIdentity * identityObject = [CBIdentity identityWithCSIdentity:identity];
        [users_list addObject:identityObject];
    }

    for (NSString *user in users_list) {
        // NSLog(@"%@", user);
        const char *c_user = [user UTF8String];
        printf("%s", c_user);
    }

    // release
    CFRelease(users_queried);
    CFRelease(query);

    return 0;
}

但是,这会产生以下错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[CBUserIdentity UTF8String]:无法识别的选择器发送到实例 0x7fac024161f0”

您可以看到我正在尝试将 转换NSStringUTF8String 并打印它,但它失败了(但是,NSLogging它可以工作)。

标签: cobjective-c

解决方案


CBIdentity不是NSString- 它是一个CBIdentity

如果您使用它打印它NSLog会转换为字符串(通过description),但是如果您在发送消息时使用它,UTF8String则它不起作用。

你已经注释掉了NSLog(@"%@", user);

如果这实际上给了您想要的东西,那么将添加部分更改为

[users_list addObject:[identityObject description]];

否则,请注意您正在循环CBIdentity,而不是NSString像这样或类似的那样更改循环。

for ( CBIdentity * user in users_list ) {
        const char *c_user = [[user posixName] UTF8String];
        printf("%s", c_user);
}

推荐阅读