调用 NSManagedObject 类上的指定初始化程序失败

Posted

技术标签:

【中文标题】调用 NSManagedObject 类上的指定初始化程序失败【英文标题】:Failed to call designated initializer on NSManagedObject class 【发布时间】:2011-07-19 18:21:15 【问题描述】:

另一个新手问题,就在我以为我开始得到一个非常 ios编程的小把戏。啊!我正在学习 appcodeblog.com,我正在构建一个简单的标签栏应用程序 输入、显示和搜索度假目的地的核心数据。我工作过 通过教程并拥有一个可以工作的应用程序,但是当我选择 “显示目的地”选项卡我收到以下错误。该应用程序似乎继续 工作,但错误被记录到控制台。我正在尝试调试 问题并准确了解正在发生的事情,但我只是不太明白 明白什么是错的。我“认为”我的问题 ShowDestinations.xib 文件,我在其中错误地连接了我的对象 西布。任何帮助深表感谢。提前感谢您的帮助和 时间。

这是错误,“CoreDataTabBarTutorial[1262:207] 未能调用指定 NSManagedObject 类 'Destination' 上的初始化程序。

我不确定要提供什么代码,所以我从显示标题开始 和实现文件 ShowDistinationsViewController.h 和 ShowDestinationsViewController.m

ShowDistinationsViewController.h

#import <UIKit/UIKit.h>


@interface SearchDestinationsViewController : UIViewController 

    UISearchBar *destinationSearchBar;
    UITableView *searchTableView;

    NSFetchedResultsController *fetchedResultsController;
    NSManagedObjectContext *managedObjectContext;

    NSArray *fetchedObjects;

 

@property (nonatomic, retain) IBOutlet UISearchBar *destinationSearchBar;
@property (nonatomic, retain) IBOutlet UITableView *searchTableView;

@property (nonatomic, retain) IBOutlet NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) IBOutlet NSManagedObjectContext *managedObjectContext;

@end

ShowDestinationsViewController.m

#import "ShowDestinationsViewController.h"
#import "Destination.h"

@implementation ShowDestinationsViewController

@synthesize destinationsTableView;
@synthesize destinationsArray;
@synthesize fetchedResultsController;
@synthesize managedObjectContext;

// Not sure where the following code came from so I commented it out!!! It didn't seem to break anything when I commented it out
//- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
//
//    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
//    if (self) 
//        // Custom initialization
//    
//    return self;
//

- (void)dealloc

    [destinationsArray release];
    [destinationsTableView release];
    [super dealloc];


- (void)didReceiveMemoryWarning

    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.


#pragma mark - View lifecycle

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView


*/

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a      nib.
- (void)viewDidLoad

    [super viewDidLoad];

*/

- (void)viewDidUnload

    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);



#pragma mark -
#pragma Data Fetch from Core Data

- (void) viewWillAppear:(BOOL)animated


    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Destination" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil)
    
        // Handle the error.
        NSLog(@"mutableFetchResults == nil");
    
    [self setDestinationsArray:mutableFetchResults];
    [request release];
    [destinationsTableView reloadData];
 


#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    // Return the number of rows in the section.
    return [destinationsArray count];


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    

    // Configure the cell...
    Destination *destination = [[Destination alloc] init];
    destination = (Destination *)[destinationsArray objectAtIndex:indexPath.row];
    cell.textLabel.text = destination.name;
    [destination release];

    return cell;


#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath




@end

【问题讨论】:

请发帖Destination.h,.m,这似乎是问题的根源。 我想我找到了问题;你不必发布它。 @5lb 低音You can't instantiate an NSManagedObject subclass without an associated NSManagedObjectContext 【参考方案1】:

问题似乎出在

Destination *destination = [[Destination alloc] init];
destination = (Destination *)[destinationsArray objectAtIndex:indexPath.row];
[destination release];

第一行是不必要的:在 Objective-C 中,Destination* 是一个指向对象的指针,而不是真正的对象。您想要的 Destination 对象可能已经在数组中。因此,您不必在[[Destination alloc] init] 行中创建指向的对象,该对象在下一行立即消失。发生了什么事

    [[Destination alloc] init] 创建一个对象adestination 指向aa 由您保留。 (Destination *)[destinationsArray objectAtIndex:indexPath.row] 为您提供另一个对象b,您不会保留该对象。 destination 现在指向 b。没有人再持有arelease 被发送到destination 指向的对象,即b。这违反了保留释放规则;你应该释放a,而不是b

所以,就去做吧

Destination *destination = (Destination *)[destinationsArray objectAtIndex:indexPath.row];

没有release 部分。

作为建议:构建项目时始终运行Analyze(位于Build 菜单下方)。该分析器旨在捕获常见类型的错误,包括您的错误。更正您的代码,以便所有分析器警告消失;您应该始终将分析器警告视为您自己的错误。

【讨论】:

"指向对象的指针,而不是真正的指针。"我认为你的意思是真实的对象。 谢谢宇治!钢铁瞄准目标!!!除了解决方案,还感谢您的解释。

以上是关于调用 NSManagedObject 类上的指定初始化程序失败的主要内容,如果未能解决你的问题,请参考以下文章

为关系内部的属性设置值时“无法调用 NSManagedObject 类上的指定初始化程序”(核心数据)

segueing 时的核心数据错误:无法在 NSManagedObject 类上调用指定的初始化程序

segueing时出现核心数据错误:无法在NSManagedObject类上调用指定的初始值设定项

CoreData:错误:无法在 NSManagedObject 类上调用指定的初始化程序

CoreData:错误:无法在创建时调用 NSManagedObject 类上的指定初始化程序

Segue 错误 - 未能在 nsmanagedobject 类上调用指定的初始化程序