0

嘿嘿

当我试图返回一个数组时,我总是收到这个奇怪的“警告”消息,但它不会中断我的应用程序

从结果类型为“ABRecordRef ”(又名“const void *”)的函数返回“ABRecordRef”(又名“const void * ”)会丢弃限定符

这是我收到此消息的代码

- (ABRecordRef *) findContactsContainingName: (NSString *) fname
{
    //TODO: add lastname, phonenumber etc.

    // Load the contacts
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, nil);
    NSArray *thePeople = (__bridge NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

    for (id person in thePeople){
        NSString *firstname = (__bridge NSString*) ABRecordCopyValue((__bridge ABRecordRef)(person), kABPersonFirstNameProperty);
        if([firstname isEqualToString: fname]){
            return (__bridge ABRecordRef)(person);
        }
    }

    return NULL;
}

有人可以解释一下为什么我会来到这里。

感谢您的帮助和快速答复

4

2 回答 2

3

删除*这里:

- (ABRecordRef *) findContactsContainingName: (NSString *) fname
               ^

ABRecordRef已经定义为指针。

于 2013-06-06T09:52:36.103 回答
1

ABRecord是 C API,它以 CoreFoundation 的方式工作。

在 CoreFoundation(和 AddressBook)中,对象被实现为 C 结构,并且使用指针来引用它们。CoreFoundation 中的一个字符串是CFStringRef,它可以与 Foundation 对象互换(或者更确切地说,免费桥接)NSString *。(即“ Ref”在其中CFStringRef暗示了一个*- 认为它是CFString *,或者更确切地说struct __CFString *

同样,ABRecordRefisABRecord *因此您的返回类型ABRecordRef *实际上 is 是ABRecord **一个辅助指针。这就是编译器所抱怨的。

您可以查看 GNUstep CoreBase 的源代码,您会发现原因。GNUstep 是用于 Linux 的 Cocoa 的开源克隆(它早于 Cocoa!),研究其源代码对于理解 Cocoa 如何在后台工作非常有帮助。

于 2013-06-06T09:56:53.733 回答