2011-05-20 46 views
10

我想創建一個ABRecordRef(s)數組來存儲具有有效生日字段的聯繫人。如何在iPhone中添加一個ABRecordRef到NSMutableArray?

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]; 
     } 
    } 

編譯器顯示這樣的警告: 警告:傳遞的參數1「ADDOBJECT:」丟棄預選賽指針目標類型 我在網上搜索,發現我必須投ABRecordRef到ABRecord *是能夠存儲在一個NSMutableArray中。

[bContacts addObject:(ABRecord*) ref]; 

但似乎ABRecord不是iOS框架的一部分。現在我如何將ABRecordRef存儲到NSMutableArray?

回答

7
[bContacts addObject:(id) ref]; 
6

創建一個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 


你應該看看埃裏卡Sadum庫的iPhone食譜的作者。下面是代碼至極激發這個代碼 - >url

12

一個ABRecordRefCFTypeRef一個typedef而這又解析爲const void *。這是警告的來源:撥打addObject:const限定符「丟失」。

在這種情況下,我們知道它是可以的。 CFTypeRef是半高級類型,此類型的實例支持CFRetainCFRelease。這反過來意味着將其轉換爲id並將其視爲NSObject可能是可以的。所以,你應該簡單地能夠做到:

[bContacts addObject:(id)ref]; 
3

我知道這是一個老問題,但自從引進ARC的,這是在以不同的方式來處理。

有增加的兩種可能的方式的ABRecordRefNSMutableArray現在,兩者都需要一個橋接轉換:

直接轉換

[bContacts addObject:(__bridge id)(ref)]; 

這只是轉換ABRecordRef指針,並應如果您沒有使用名稱中包含Create的方法自己創建ref,則可以使用它。

所有權轉讓給ARC

[bContacts addObject:CFBridgingRelease(ref)]; 

此轉換ABRecordRef指針,除了其轉移到ARC的所有權。應該使用這個,如果你使用了例如ABPersonCreate()創建一個新的人。

更多信息可在Transitioning to ARC Release Notes中找到。 Stack Overflow還有很多其他信息來源,例如this question

相關問題