2011-01-31 4 views
0

to-many 관계가있는 코어 데이터를 사용하여 iPhone 응용 프로그램을 개발 중이며 내 클래스 중 하나에 NSSet 속성이 있습니다. NSSet을 생성하고이 속성에 할당 한 다음 객체를 해제하면 문제가 발생합니다. EXC_BAD_ACCESS. NSManagedObject에서 over-Released 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];을 제거하고, 내가 해결 문제를 가지고 ... 질문입니다. 피드 집합을 feedList 속성에 할당 할 때 객체를 유지하지 않은 이유는 무엇입니까?

감사합니다!

답변

0

signature.feedList = feedSet;이 보유하지 않을 경우 속성은 assign (copy 또는 retain이 아님)으로 정의되어 있기 때문입니다. 또는 합성되지 않은 경우 setter 구현이 처리됩니다.

그런 경우가 아니면 autorelease 또는 release 어딘가에 있습니다.

여기서 retainCount은 아주 좋은 지표는 아닙니다. autorelease은 보유 수를 즉시 감소시키지 않습니다.


아하! 당신이 말했듯이 @dynamic feedList; 이것은 관리 객체 하위 클래스입니까?

@dynamic은 메소드 구현을 제공하지 않습니다. 따라서 setFeedList:을 구현했거나 NSManagedObject을 서브 클래 싱 (또는 해당 수퍼 클래스가 관련되어 있음) 중 하나입니다.

어느 쪽입니까?

그리고 크래시 백 트레이스도 게시하십시오.

+0

하지만 그 이유는 혼란 스럽습니다. 내 속성 선언에 retain을 사용하고 있기 때문입니다. Signature.h @property (비 원자력, 보유) NSSet * feedList; 서명 .m @dynamic feedList; –

0

아마 Signature가 클래스이고 feedList 속성이 있습니다. 객체를 유지하려면이 객체를 선언해야합니다.

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

하지만 그것이 선언 된 방법입니다. –

+0

귀하의 재산에 문제가 있다고 생각하지 않습니다. NSSet * feedSet = [[NSSet alloc] initWithSet : mutableFeedSet]; -이 줄은 mutableFeedSet의 객체가 유지된다는 것을 의미하므로 mutableFeedSet을 먼저 해제 한 다음 feedSet을 두 번 놓으면 객체가 두 번 릴리스됩니다. 그래서 저는 여러분이 그 세트의 객체 중 일부를 과도하게 릴리즈했다고 확신합니다 (어쩌면 autorelease를 릴리즈했을 수도 있습니다). 내가 옳다면, [mutableFeedSet release]로 라인을 주석 처리하십시오; [feedSet release]의 주석 처리를 제거합니다. 또한 충돌을 제거합니다. – Max

관련 문제