给另一个对象一个 NSManagedObject

Posted

技术标签:

【中文标题】给另一个对象一个 NSManagedObject【英文标题】:Giving another object a NSManagedObject 【发布时间】:2010-06-01 13:28:29 【问题描述】:

好的,所以我的代码遇到了问题。我所做的是 UIButton 的子类化,因此我可以为它提供更多与我的代码相关的信息。我已经能够创建按钮并且它们工作得很好。拼音。

但是,我希望我的子类拥有的一件事是对 NSMangedObject 的引用。我的头文件中有这段代码:

@interface ButtonSubclass : UIButton 
    NSManagedObjectContext *context;
    NSManagedObject *player;


@property (nonatomic, retain) NSManagedObject *player;
@property (nonatomic, retain) NSManagedObjectContext *context;

- (id)initWithFrame:(CGRect)frame andTitle:(NSString*)title;
//- (void)setPlayer:(NSManagedObject *)aPlayer;

@end

如您所见,它有一个我希望它保存的 NSMagedobject(以及 Context)的实例变量。但是对于我的生活,我无法让它持有那个 NSManagedObject。我在实现文件中运行了这两个@synthesize 方法。

@synthesize context;
@synthesize player;

所以我不确定我做错了什么。这就是我创建按钮的方式:

ButtonSubclass *playerButton = [[ButtonSubclass alloc] initWithFrame:frame andTitle:@"20"]; //works

        playerButton.context = self.context; //works
        playerButton.player = [players objectAtIndex:i]; //FAILS

而且我之前已经初始化了玩家数组,在那里我得到了对象。另一个奇怪的事情是,当它到达代码中的这个位置时,应用程序崩溃(woot)并且控制台输出停止。它没有给我任何错误,并且根本没有通知该应用程序已崩溃。它只是……停下来。所以我什至不知道导致代码崩溃的错误是什么,除了它与那里设置“播放器”变量的那条线有关。想法和想法?我喜欢你的智慧!

【问题讨论】:

与问题无关,但您实际上不必拥有NSManagedObjectContext 的属性--您可以只使用player 对象的managedObjectContext 属性。 【参考方案1】:

您拥有的代码不应该工作并没有什么特别的原因。您可以将 NSManageObject 实例分配为属性。崩溃的最简单解释是数组的越界错误。当您没有从控制台收到错误时,通常是因为调试器崩溃了。这通常是由于某种递归导致调试器堆栈溢出。

但是,将数据逻辑放在像按钮这样的视图元素中是非常非常糟糕的做法。这完全打破了 MVC 设计模式,并使您的代码变得脆弱且难以维护。 UI 元素应该是“愚蠢的”并且只知道如何显示传递给它们的任何数据,它们不应该参与实际跟踪数据本身。那分别是控制器和数据模型的功能。

理想情况下,“玩家”对象应该由控制器链接到适当的 UI 按钮或 其他 UI 元素的数据模型进行跟踪。数据模型中的播放器使设计灵活,易于扩展、重用和维护。

【讨论】:

我试图找出一种方法来做到这一点,当我最终决定我可以使用按钮上的 Tag 属性来跟踪它们时。谢谢!【参考方案2】:

尝试先添加一些调试代码

ButtonSubclass *playerButton = [[ButtonSubclass alloc] initWithFrame:frame andTitle:@"20"]; //works
playerButton.context = self.context; //works
NSLog(@"total players: %d", players.count);
NSLog(@"players: %@", [players objectAtIndex:i]);
playerButton.player = [players objectAtIndex:i]; //FAILS

这可能揭示了错误

【讨论】:

+1 这是查找假定的越界错误的好方法。【参考方案3】:

您不能简单地通过将其声明为属性并添加@synthesize 来创建托管对象上下文。托管对象上下文由应用程序委托创建,您可以这样称呼它:

[[NSApp delegate] managedObjectContext];

我不知道你如何初始化玩家数组,但我怀疑它不包含你认为它包含的对象:NSManagedObjectContext 只有返回 NSSet 和 while 的方法

[[[NSApp delegate] managedObjectModel] entities];

确实返回一个数组,它包含 NSEntityDescription 的实例。我建议您首先查看应用程序的应用程序委托 (AppDelegate.m) 的代码,以了解有关 Core Data 存储入口点的更多信息。

【讨论】:

以上是关于给另一个对象一个 NSManagedObject的主要内容,如果未能解决你的问题,请参考以下文章

复制一个对象内容给另一个对象

为啥在Javascript中将一个对象分配给另一个变量也会改变初始对象[重复]

给另一个对象一个 NSManagedObject

如何将一个对象的引用传递给另一个对象并仍然修改第一个对象?

Python:通过将对象分配给另一个对象来修改它

Javascript 2对象数组,从一个对象数组中获取一个值并将其分配给另一个对象数组