[英]how can I Add a ABRecordRef to a NSMutableArray in iPhone?
我想创建一个ABRecordRef(s)数组来存储具有有效生日字段的联系人。
NSMutableArray* bContacts = [[NSMutableArray alloc] init];
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for( int i = 0 ; i < nPeople ; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i );
NSDate* birthdayDate = (NSDate*) ABRecordCopyValue(ref, kABPersonBirthdayProperty);
if (birthdayDate != nil){
[bContacts addObject:ref];
}
}
编译器显示此警告: 警告:传递'addObject:'的参数1'从指针目标类型中丢弃限定符我在Web上搜索并发现我必须将ABRecordRef强制转换为ABRecord *以便能够存储在NSMutableArray中。
[bContacts addObject:(ABRecord*) ref];
但似乎ABRecord不是iOS框架的一部分。 现在我如何将ABRecordRef存储到NSMutableArray?
ABRecordRef
是ABRecordRef
的typedef, CFTypeRef
又解析为const void *
。 这就是警告的来源:通过调用addObject:
, const
限定符“丢失”。
在这种情况下,我们知道没关系。 CFTypeRef是半高级类型,此类型的实例支持CFRetain
和CFRelease
。 这反过来意味着可以将它转换为id
并将其视为NSObject。 所以你应该能够做到:
[bContacts addObject:(id)ref];
[bContacts addObject:(id) ref];
创建一个NSObject,它会像这样存储您的ABRecordRef:
// ABContact.h
@interface ABContact : NSObject
{
ABRecordRef _record;
}
@property (nonatomic, readonly) NSDate *birthday;
- (id)initWithRecord:(ABRecordRef)aRecord;
@end
// ABContact.m
@implementation ABContact
#pragma mark - Init
- (id)initWithRecord:(ABRecordRef)aRecord;
{
if ((self = [super init]))
_record = CFRetain(aRecord);
return self;
}
#pragma mark - Getter
- (NSDate *)birthday
{
return (NSDate *)ABRecordCopyValue(record, kABPersonBirthdayProperty) autorelease];
}
#pragma mark - Memory management
- (void)dealloc
{
CFRelease(_record);
[super dealloc];
}
@end
你应该看一下iPhone手册的作者Erica Sadum图书馆。 以下是启发此代码的代码 - > url
我知道这是一个老问题,但自从引入ARC以来,这是以不同的方式处理的。
现在有两种方法可以将ABRecordRef
添加到NSMutableArray
,这两种方法都需要桥接转换:
直接转换
[bContacts addObject:(__bridge id)(ref)];
这只是转换ABRecordRef
指针,如果你没有使用名称中包含Create
的方法自己创建ref
,则应该使用它。
将所有权转让给ARC
[bContacts addObject:CFBridgingRelease(ref)];
这会转换ABRecordRef
指针,并将其所有权转移给ARC。 如果您使用例如ABPersonCreate()
来创建新人,则应该使用此ABPersonCreate()
。
有关更多信息,请参阅“ 转换为ARC发行说明” 。 Stack Overflow上还有许多其他信息来源,例如这个问题 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.