我应该在哪里发布一个对象?它可以释放自己吗?

时间:2011-08-25 07:00:21

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

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

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

我以为我会这样做:

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

但是,我在哪里发布这个对象?

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

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

2 个答案:

答案 0 :(得分:3)

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];而不是[[FriendInfo alloc] init]之类的东西来创建它,就像它是NSObject一样。思维方式的转变是,在您将任何数据放入其中之前,对象是由ManagedObjectContext创建和管理的,您请求新数据并放入数据,然后通知ManagedObjectContext您要对该对象执行的操作 - 保存或回滚(撤消自上次保存以来的所有更改。

答案 1 :(得分:0)

你解释的问题是“高级别”,很难给出具体的建议。但总的来说,您可能只想使用ARC,并且不要轻易解决您提到的大多数内存管理问题。

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

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

所以我先从它开始,然后提出更具体的问题。现在,如果你按照你建议的路线,我真的没有看到你提到的问题有任何一般性的困难......