2009-12-06 121 views
0

在一个非常小的数目在我的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

(1)ABAddressBookCopyArrayOfAllPeople()返回一个CFArrayRef,而不是CFMutableArrayRef。 (2)CFArrayRef,CFMutableArrayRef和NSArray之间的所有转换都是不相关的。 NSArray和CFArray是同义词。 (3)for()循环中的autorelease池是不相关的。没有任何新的对象在for()循环中创建,因此没有任何东西落入池中。 objectAtIndex也不会保留/自动释放对象。 (4)对ABAddressBookCopyArrayOfAllPeople()返回的数组进行排序可能是一个崩溃触发器。该函数被声明为返回一个CFArrayRef(),它应该被视为不可变的。

如果应用程序崩溃,请发布崩溃的回溯。没有这些,很难说明具体触发事故的是什么。它在运行上面的代码的线程中崩溃了吗? ...或者在新创建的线程中崩溃?

+0

3 - 除非在那里发生“someObject”的创建。 – 2009-12-06 00:42:27

+0

是的,someObject被创建。并且在排序部分没有发生崩溃,但是在for循环之后。而且没有回溯......这是一个实时问题,但它不会导致崩溃,只会为用户挂起。 – 2009-12-06 02:45:01

+0

您应该能够在调试器挂起并进行回溯时进入调试器。但是,它可能是因为(4) - 你可能正在移动AB的奶酪。 – bbum 2009-12-06 03:47:07

相关问题