【问题标题】:Bad Access error in Thread with a managed object in iOS线程中的错误访问错误与 iOS 中的托管对象
【发布时间】:2014-06-05 20:59:12
【问题描述】:

我的 Sqlite DB 中有一行代码是一个表:

Users *users = [[Users alloc] init];

... do some processing in a thread and other stuff

} //end function

但是我注释掉了除了 Users *users 行之外的所有内容,当我到达函数调用结束时,我发现我的错误与该行有关。错误是:

"Thread X: EXC_BAD_ACCESS (code=1, address=xxxxx)

为什么会这样?

【问题讨论】:

  • *usersNSManagedObject 的一个实例?
  • 是的,这是不好的做法还是错误的?
  • 我有一个由子类自动生成的 Users.h/.m 文件,是一个表名
  • “表名”是什么意思?你没有使用 Core Data 吗?
  • 是的,在模型的设计视图中,它被称为用户,具有属性和关系

标签: ios objective-c core-data ios7 nsmanagedobject


【解决方案1】:

任何托管对象都属于 ManagedObjectContext。并且任何 ManagedObjectContext 以及属于它的所有托管对象都只能在 one 线程中使用。否则,您将遇到各种麻烦,包括崩溃。

【讨论】:

  • OP 说他们注释掉了除了Users *users 行之外的所有内容。
【解决方案2】:

您无法使用init 创建NSManagedObject 实例。 NSManagedObjectNSManagedObjectContext 关联,并且必须使用:initWithEntity:insertIntoManagedObjectContext: 创建。

Creating and Deleting Managed Objects

【讨论】:

  • 真正的原因是我有一个名为 Users+Authenication 的类别,它有一个 - (void) saveAllMyUsers... 但是如果我无法创建实例,我该如何称呼它?
  • 您可以创建实例,但不能直接创建。如果你想这样做,那么你不应该使用 Core Data。 Core Data 不仅仅是一个 sqlite 的接口,而是一个对象图管理器和持久性框架。我建议您在继续前进之前退后一步,了解 Core Data 的工作原理。
  • 我想要实例的唯一原因是调用我的类别函数 - (void) 而不是类函数 + (Users)
  • 这也是不好的做法。 NSManagedObjectContext 是处理将更改保存到数据存储的类。见here
  • 但是我将上下文和所有细节传递到类别中以对其进行抽象。我只需要知道怎么称呼它?我应该把保存代码放在视图控制器的哪里?
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2016-05-29
相关资源
最近更新 更多