2009-12-06 31 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

相關問題