首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将ABRecordRef添加到iPhone中的NSMutableArray中?

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

Stack Overflow用户
提问于 2011-05-20 11:28:50
回答 4查看 7.3K关注 0票数 10

我想要创建一个ABRecordRef数组来存储具有有效生日字段的联系人。

代码语言:javascript
复制
   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中。

代码语言:javascript
复制
[bContacts addObject:(ABRecord*) ref];

但ABRecord似乎不是iOS框架的一部分。现在我如何将ABRecordRef存储到NSMutableArray?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-20 11:40:20

代码语言:javascript
复制
[bContacts addObject:(id) ref];
票数 7
EN

Stack Overflow用户

发布于 2011-05-20 11:56:19

ABRecordRefCFTypeRef的类型--它反过来解析为const void *。这就是警告的来源:通过对addObject:的调用,const限定符“丢失”。

在这种情况下,我们知道这是可以的。CFTypeRef是一种半高级类型,这种类型的实例支持CFRetainCFRelease。这反过来意味着将其转换为id并将其作为NSObject处理可能是可以的。因此,您应该能够简单地做到:

代码语言:javascript
复制
[bContacts addObject:(id)ref];
票数 12
EN

Stack Overflow用户

发布于 2011-05-20 11:48:50

创建一个NSObject ABRecordRef商店,如下所示:

代码语言:javascript
复制
// 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

您应该看看Erica库,它是iPhone食谱的作者。下面是激发这段代码-> url的代码

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6071256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档