2010-07-05 14 views
0

我在一個名爲「Item」的CoreData實體中有簡單的樹結構。爲什麼當我嘗試設置關係時CoreData與「無法識別的選擇器」崩潰?

任何項目都可以是其他項目的父項目,並且可以有多個子項目。

有下面的實體關係:

childItems:一對多,目標:項目,逆:parentItem。可選 parentItem:Destination:Item,inverse:childItems。可選

我使用的Xcode生成以下Item.h:

@interface Item : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * title; 

@property (nonatomic, retain) Item * parentItem; 
@property (nonatomic, retain) NSSet* childItems; 


@end 


@interface Item (CoreDataGeneratedAccessors) 
- (void)addChildItemsObject:(Item *)value; 
- (void)removeChildItemsObject:(Item *)value; 
- (void)addChildItems:(NSSet *)value; 
- (void)removeChildItems:(NSSet *)value; 

@end 

獲取請求非常簡單:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
    entityForName:@"Item" inManagedObjectContext:[self managedObjectContext]]; 
[fetchRequest setEntity:entity];  
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects: sort, nil]]; 
[fetchRequest setFetchBatchSize:20]; 

NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
     managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil 
     cacheName:@"AllItemsCache"]; 

當我嘗試設置關係,它只是崩潰。爲什麼?

Item *item = [itemFetchedResultsController.fetchedObjects objectAtIndex:0]; 
[item addChildItemsObject:childItem]; 

調試輸出:

*** -[Item addChildItemsObject:]: unrecognized selector sent to instance 0x5494140 

(gdb) po 0x5494140 
<Item: 0x5494140> (entity: Item; id: 0x54921d0 <x-coredata://AB862620-04BE-4E42-84A6-8723455F5957/Item/p1> ; data: { 
    title = Test123; 
}) 

我可以設置或獲取其他屬性就好了。但是當我嘗試改變關係時,它會崩潰。 我在做什麼錯?

+0

childItem從哪裏來?是否有機會嘗試使它成爲父項? – theMikeSwan 2010-07-05 18:00:54

回答

1

我猜想這是一個命名衝突引起的使用像「Item」這樣的通用詞作爲類名。嘗試重構名稱以更獨特。

或者,你可以嘗試驗證類不迴應方法:

Item *item = [itemFetchedResultsController.fetchedObjects objectAtIndex:0]; 
NSLog(@"responds=%@",[item respondsToSelector:@selector(addChildItemsObject:)] [email protected]"YES":@"NO"); 
[item addChildItemsObject:childItem]; 

或調查對象的類直接返回:

NSLog(@"class=%@",[[itemFetchedResultsController.fetchedObjects objectAtIndex:0] class]); 

這有可能是你實際上返回通用NSManagedObject被默默地轉換爲它的Item子類。不太可能,但你不妨檢查一下。

1

找到問題的原因。

CoreData模型和數據類只有在它們在您的項目中時纔有效。 如果你把它們放到依賴項目中,它會出現像上面這樣的奇怪錯誤。

我的.xcdatamodel和實體類在其他項目和其他項目添加到主項目。

只要我將所有東西都移到主項目中,並刪除了依賴項,它就可以正常工作。

相關問題