繁体   English   中英

如何将ABRecordRef添加到iPhone中的NSMutableArray?

[英]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?

ABRecordRefABRecordRef的typedef, CFTypeRef又解析为const void * 这就是警告的来源:通过调用addObject:const限定符“丢失”。

在这种情况下,我们知道没关系。 CFTypeRef是半高级类型,此类型的实例支持CFRetainCFRelease 这反过来意味着可以将它转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM