【问题标题】:Where should I release an object? Can it release itself?我应该在哪里释放一个对象?它可以释放自己吗?
【发布时间】:2011-08-25 07:00:21
【问题描述】:

我想从 Facebook 获取朋友信息并使用 Core Data 保存。

我构建了一个 FriendsManager 类,它从 Facebook 获取好友列表(姓名和 ID) 和一个 FriendInfo 类,它接受 id 并获取有关此朋友的所有信息。

我以为我会这样做:

  • 创建 FriendsManager 的对象让它得到我所有的朋友(不是问题);
  • 在 FriendsManager 中创建 FriendInfo 的实例;
  • 给它 id,让它获取我需要的所有信息,包括家乡的地理编码;
  • 将所有这些与核心数据一起保存。

但是我应该在哪里释放这个对象呢?

为了获取所有朋友的信息,我将在一个循环中创建这些对象,该循环通过我的带有朋友 ID 的数组。

我还使用 Grand Central Dispatch 进行所有获取信息和地理编码,因此不知道 FriendInfo 何时获得所需的所有数据并准备就绪。

【问题讨论】:

    标签: iphone objective-c class-design release-management grand-central-dispatch


    【解决方案1】:

    Core Data 对象通常是 NSManagedObject 的子类,而不是 NSObject。您不会分配或释放它,而是使用 ManagedObjectContext 创建一个,然后保存或删除它,但不会释放它,因为您不拥有它。

    一个 NSObject(ARC 之前)遵循内存管理的常规规则——简单地说,如果你通过 alloc、copy 或以 new 开头的方法获得它,它就是你的,当你不再使用它时需要使用 release .如果你在没有分配的情况下得到它——例如"NSString *string = [NSSTring stringWithFormat:@"test"];,那么它是自动释放的,你不需要释放它。

    信任分析器 - shift-command-B。

    听起来您可能想要定义核心数据模型,然后为好友信息创建一个 NSManagedObject 子类。你可以使用[NSEntityDescription insertNewObjectForEntityForName:@"FriendInfo" inManagedObjectContext:moc]; 之类的东西来创建它,而不是像它是一个NSObject 那样使用[[FriendInfo alloc] init]。想法的转变是,在您将任何数据放入其中之前,对象是由 ManagedObjectContext 创建和管理的,您请求一个新对象并放入数据,然后通知 ManagedObjectContext 您希望对该对象执行什么操作 - 保存或回滚(反转自上次保存以来的所有更改)。

    【讨论】:

    • 我忘了说 FriendInfo 不是我想保存的类!我已经有一个名为 Friend 的 NSManagedObject,我认为我在 FriendInfo 中创建了其中一个并保存了所有信息!所以我必须释放我的 FriendInfo 因为我是用 alloc 创建的! ARC 即将与 iOS 5 一起推出,对吗?
    • 为什么不直接定义 NSManagedObject 子类并将您想要存储的值直接写入其中呢?似乎您不需要中间对象。这种方法不会随着 ARC 而改变,因为您不拥有 NSManagedObjects,您仍然不会在假设的 NDA 下的未来操作系统中保留或释放它们 :-)
    • 所以你是说我可以在 NSManagedObject 类中获得我需要的所有信息?我可以像普通班级一样使用它吗?写方法和东西?我怎么知道它的寿命?例如来自其他类的回调?
    • 如果您想要一个长期对象能够充当系统中其他对象的代理,您可能应该自己创建并拥有这些对象。但是,您可以向 NSManagedObject 类添加方法,通常添加 setter/getter 方法。但请注意,如果您从托管对象模型重新生成它们,它们可能会被清除。您可能想研究 mogenerator -rentzsch.github.com/mogenerator 它解决了使用生成的类所产生的许多问题。
    【解决方案2】:

    你解释的问题比较“高级”,很难给出具体的建议。但总的来说,您可能只想使用 ARC,而不必为您提到的大多数内存管理问题而烦恼。

    此外,由于您提到要使用核心数据,因此您不会释放任何要保存的对象,因为核心数据会保存上下文的所有对象,因此它们永远不会被“释放”。

    您建议的关于使用 GeneralManagerClass 检索所有信息并填充新朋友实例的方法通常是可以的。我也是这样做的,它使思考相对容易。

    所以我会从它开始,然后提出更具体的问题。目前,如果您按照您建议的路线进行操作,我确实没有看到您提到的问题有任何普遍的困难......

    【讨论】:

    • 请注意我写给@Adam 帖子的评论
    • 我有一个问题!我可以像普通类一样处理 NSManagedObject 吗?我的意思是我可以写方法和东西吗?我可以进行地理编码并获取此类中的所有其他信息吗?我怎么知道它活了多久?例如,如果我确实有来自其他类的回调?我可以将其设置为某事的代表吗?
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2011-01-11
    • 2011-03-14
    • 2017-03-31
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多