2011-01-31 45 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