2011-01-31 40 views
0

我正在開發一個iPhone應用程序,使用具有多對多關係的核心數據,並且在我的一個類中有一個NSSet屬性。我正在創建一個NSSet,分配給此屬性,然後釋放該對象,問題是我得到一個EXC_BAD_ACCESSNSManagedObject中的過度釋放NSSet

NSSet *feedSet = [[NSSet alloc] initWithSet:mutableFeedSet]; 
Signature *signature = (Signature *) [NSEntityDescription insertNewObjectForEntityForName:@"Signature" inManagedObjectContext:context]; 
signature.site = [feed objectForKey:@"site"]; 
signature.url = [feed objectForKey:@"url"]; 
signature.feedList = feedSet; 

NSLog(@"%d", [feedSet retainCount]); 

[context save:&error]; 

[feedArray release]; 
[mutableFeedSet release]; 
[formatter release]; 
[feedSet release]; 

當我打印的feedSet保留計數我意識到signature.feedList = feedSet;沒有保留的對象,所以我刪除了[feedSet release];和我得到解決的問題......問題是。爲什麼當將feedSet分配給feedList屬性時,它沒有保留該對象?

謝謝!

回答

0

如果signature.feedList = feedSet;不保留它,這是因爲該屬性被定義爲assign(不是copyretain)。或者,如果不合成,你的setter實現就會被洗掉。

如果不是這種情況,您在某處會出現流浪的autoreleaserelease

請注意retainCount這裏不是一個很好的指標; autorelease不會導致保留計數立即減少。


啊哈!你說@dynamic feedList;這是一個託管對象的子類嗎?

@dynamic不提供方法實現。所以,要麼你實施了setFeedList:,要麼你的子類是NSManagedObject(或者他們是涉及的超類)。

這是什麼?

並且請追蹤崩潰回溯。

+0

但這就是爲什麼我很困惑,因爲我在我的財產聲明中使用保留。 Signature.h @property(nonatomic,retain)NSSet * feedList; Signature.m @dynamic feedList; – 2011-02-01 00:42:13

0

大概Signature是你的類,你有屬性feedList。如果你想保留的對象,你必須聲明它是這樣的

@property(nonatomic, retain) NSSet* feedList; 
+0

但這是如何宣佈它。 – 2011-02-01 00:46:21