【问题标题】:how can I Add a ABRecordRef to a NSMutableArray in iPhone?如何将 ABRecordRef 添加到 iPhone 中的 NSMutableArray?
【发布时间】:2011-05-20 11:28:50
【问题描述】:

我想创建一个 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 会丢弃来自指针目标类型的限定符 我在网上搜索,发现我必须将 ABRecordRef 转换为 ABRecord* 才能存储在 NSMutableArray 中。

[bContacts addObject:(ABRecord*) ref];

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

【问题讨论】:

    标签: iphone objective-c xcode nsmutablearray addressbook


    【解决方案1】:

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

    在这种情况下,我们知道没关系。 CFTypeRef 是一个半高级类型,这种类型的实例支持CFRetainCFRelease。这反过来意味着将其转换为 id 并将其视为 NSObject 可能是可以的。所以你应该能够做到:

    [bContacts addObject:(id)ref];
    

    【讨论】:

      【解决方案2】:
      [bContacts addObject:(id) ref];
      

      【讨论】:

        【解决方案3】:

        创建一个 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

        【讨论】:

          【解决方案4】:

          我知道这是一个老问题,但是自从引入 ARC 之后,就以不同的方式处理了。

          现在有两种可能的方法可以将ABRecordRef 添加到NSMutableArray,这两种方法都需要桥接演员:

          直接转化

          [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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-12-13
            • 2012-10-02
            • 2011-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多