代码之家  ›  专栏  ›  技术社区  ›  Z S

记忆管理:我在这里做错什么了吗?

  •  0
  • Z S  · 技术社区  · 15 年前

    在我的iphone应用程序中,有极少数情况下,在下面的代码中的for循环之后,我会崩溃:

    ABAddressBookRef addressBookInit = ABAddressBookCreate();
    
    CFMutableArrayRef abContacts =
    (CFMutableArrayRef)ABAddressBookCopyArrayOfAllPeople(addressBookInit); // get array of all contacts
    CFArraySortValues (abContacts, CFRangeMake(0, CFArrayGetCount(abContacts)), (CFComparatorFunction)ABPersonComparePeopleByName, (void *)ABPersonGetSortOrdering());
    
    NSArray *copypeople = (NSArray *) abContacts;
    NSMutableArray *tempTheadlist = [[NSMutableArray alloc] init];
    
    for (int i=0; i < copypeople.count; i++)
    {
       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
       ABRecordRef record = [copypeople objectAtIndex:i];
       if (blah blah)
             [tempThreadList addObject: someObject];
       [pool release];
    }
    
    // POINT OF CRASH AFTER LOOP ENDS
    
    if (tempTheadlist.count > 0)
            [NSThread detachNewThreadSelector: @selector(loading_pictures:) toTarget:self withObject:tempTheadlist];
    
    
    [tempTheadlist release];
    [copypeople release];
    CFRelease(addressBookInit);
    

    有什么理由让它在这里崩溃?

    1 回复  |  直到 15 年前
        1
  •  1
  •   bbum    15 年前

    (1) ABAddressBookCopyArrayOfAllPeople() 返回 CFArrayRef ,不是 CFMutableArrayRef 是的。

    (2)cfArrayRef、cfMutableArrayRef和nsArray之间的所有类型转换都不相关。nsarray和cfarray是同义词。

    (3)for()循环中的自动释放池不相关没有 新的 在for()循环中创建的对象,因此池中不会有任何内容。objectatindex也不会:保留/自动释放对象。

    (4)对ABAddressBookCopyArrayOfAllPeople()返回的数组进行排序可能是一个崩溃触发器该函数声明为返回cfArrayRef(),应将其视为不可变的。

    如果应用程序崩溃,请发布崩溃的回溯没有这一点,就很难说是什么具体触发了此次坠机。是否在运行上述代码的线程中崩溃?…或者在新创建的线程中崩溃?