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

时间:2009-12-06 00:24:05

标签: objective-c iphone

在我的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 个答案:

答案 0 :(得分:1)

(1)ABAddressBookCopyArrayOfAllPeople()返回CFArrayRef,而不是CFMutableArrayRef

(2)CFArrayRef,CFMutableArrayRef和NSArray之间的所有强制转换是无关紧要的。 NSArray和CFArray是同义词。

(3)for()循环中的自动释放池是无关紧要的。在for()循环中没有创建任何 new 对象,因此没有任何内容落入池中。 objectAtIndex也不会:保留/自动释放对象。

(4)您正在对ABAddressBookCopyArrayOfAllPeople()返回的数组进行排序可能是崩溃触发器。该函数被声明为返回CFArrayRef(),它应被视为不可变。

如果应用程序崩溃,请发布崩溃的回溯。没有它,很难说出具体触发崩溃的原因。它是否在运行上述代码的线程中崩溃? ...或者在新创建的线程中崩溃?