尝试返回数组时发出奇怪的警告

时间:2013-06-06 09:45:11

标签: objective-c

Heey

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

从结果类型为'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;
}

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

感谢您的帮助和快速回答

2 个答案:

答案 0 :(得分:3)

在此处删除*

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

ABRecordRef已被定义为指针。

答案 1 :(得分:1)

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

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

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

您可以查看GNUstep CoreBase的源代码,您将找到原因。 GNUstep是Linux的Cocoa的开源克隆(它早于Cocoa!),研究它的源代码对理解Cocoa的工作原理非常有帮助。