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 ..
感谢您的帮助和快速回答
答案 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 *
)
同样,ABRecordRef
为ABRecord *
,因此您的返回类型ABRecordRef *
实际上是ABRecord **
,是辅助指针。这就是编译器所抱怨的。
您可以查看GNUstep CoreBase的源代码,您将找到原因。 GNUstep是Linux的Cocoa的开源克隆(它早于Cocoa!),研究它的源代码对理解Cocoa的工作原理非常有帮助。