2009-12-29 18 views
0

我有一個符合NSCoding的自定義對象,因爲該對象在終止時應該可寫入磁盤。在這個類中,我擁有各種屬性,包含Ncotrings,NSArrays,NSDictionaries等可可對象類型。一個特定的屬性是這一個:尷尬:encodeObject與Array會導致EXC_BAD_ACCESS錯誤,絕望

@property (readwrite, copy) NSArray *artistReleases; 

它實際上是一個數組,它應該容納一些NSDictionaries。這些字典是在負責解析XML文件數據的類方法中創建的。

[encoder encodeObject:artistReleases forKey:@"artistReleases"]; 

我會得到一個EXC_BAD_ACCESS錯誤:

artist.artistReleases = [NSArray arrayWithArray:releases]; 

的錯誤,當我試圖將財產保存我的編碼器發生。 NSZombie告訴我

*** -[CFString retain]: message sent to deallocated instance 0xd6f28fe0 

......我絕對沒有想法在哪裏尋找這個保留。 malloc_history告訴我:

ALLOC 0xd6f28fe0-0xd6f28fff [size=32]: thread_b0244000 |thread_start | 
_pthread_start | __NSThread__main__ | -[NSThread main] | 
-[SearchViewController invokeGetArtist:] | +[GetDetails getArtist:summary:theURL:] | 
-[CXMLNode stringValue] | +[NSString stringWithUTF8String:] | 
-[NSPlaceholderString initWithBytes:length:encoding:] | 
CFStringCreateWithBytes | __CFStringCreateImmutableFunnel3 | 
_CFRuntimeCreateInstance | GMmalloc_zone_malloc_internal 

我沒有具體的想法來製作它。這對我沒有任何意義。也許有人可以通過解釋malloc歷史來指向某個方向。


編輯

這裏就是填充有關財產的一部分。爲了修正錯誤,我評論了一些CXMLNode調用,並沒有在這裏插入這些調用。這也意味着這些對象似乎沒有錯誤(直到我嘗試訪問使用這些方法創建的數據)。順便說一下,我使用TouchXML進行XPath查詢。

NSArray *releaseNodes; 
releaseNodes = [root nodesForXPath:@"/pathToReleases" error:nil]; 
NSMutableArray *releases = [[NSMutableArray alloc] init]; 

for (CXMLElement *resultElement in releaseNodes) { 
    if (resultElement != nil) { 
     NSMutableDictionary *releaseElement = [[NSMutableDictionary alloc] init]; 

     for (int counter = 0; counter < [resultElement childCount]; counter++) { 
      [releaseElement setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]]; 
     } 
     [releases addObject:releaseElement]; 
     [releaseElement release]; 
    } 
} 
if ([releases count] == 0) 
    [releases addObject:[NSMutableDictionary dictionaryWithObject:@"-" forKey:@"title"]]; 
artist.artistReleases = [NSArray arrayWithArray:releases]; 

EDIT 2 如有關財產失去其內容我已經收窄。 po'ing錯誤

Program received signal SIGTRAP, Trace/breakpoint trap. 

這點是這對getArtist的調用創建的自動釋放池得到釋放通過GDB結果的某一點後的財產。所有其他屬性都很好,但是......所有 - 錯誤在於我在第一次編輯中發佈的代碼部分?

回答

0

找出你填充陣列的位置。最有可能的是,您已經過度釋放了您已插入陣列中的某個字符串。當編碼器對象試圖訪問過度釋放的對象時,會出現錯誤。

1

要麼你的GetDetails類是borked,要麼是調用它的人是borked。具體而言,請參閱分配跟蹤的這一部分:

+[GetDetails getArtist:summary:theURL:] 
-[CXMLNode stringValue] 

如果正確地實施,CXMLNodestringValue方法返回一個自動釋放字符串。有些東西需要調用-retain(直接或通過屬性設置器)。

或者,可能的getArtist:summary:theURL:方法被設計爲返回保留字符串?如果是這樣,那麼在返回之前它應該返回stringValue的結果。

沒有看到更多的代碼,這是不可能說更多。如果我是下注類型,我懷疑getArtist:summary:theURL:是通過參考返回藝術家和總結?如果是這樣,這是一個強大的愚蠢設計 - 非典型的,甚至 - 但我敢打賭,來電者認爲藝術家和/或總結在他們不是時保留? ....或者在某個地方有一個額外的電話呼叫?

+0

我編輯了我原來的帖子,添加了一些更多的代碼。 getArtist應該只返回Artist對象,摘要最終將被保存爲藝術家對象的屬性。 – ff10 2009-12-29 01:04:07