0

虽然我意识到一个是类方法,另一个是实例方法,但它们在 Apple 文档中具有完全相同的描述,所以我不太了解不同的语法/用例。

4

3 回答 3

2

它们的功能是等效的,但是类方法返回一个自动释放的对象。也就是说,它可能是按照以下方式实现的:

+ (NSFetchRequest *)fetchRequestWithEntityName:(NSString *)entityName {
    return [[[NSFetchRequest alloc] initWithEntityName:entityName] autorelease];
}

这是 Objective-C 库中相当常见的模式,称为类工厂方法

于 2012-04-27T11:51:13.827 回答
0

这两个 API 的主要区别如下:

fetchRequestWithEntityName会给你一个自动释放对象,所以一旦事件循环结束,它将从内存中释放,直到你保留它。

但是initWithEntityName会给你要释放的对象,否则会有内存泄漏。

于 2012-04-27T11:55:12.647 回答
0

根据您所说,如果它们确实具有相同的用例,则根据Apple使用的内存管理设计,唯一的区别与objective-C上的垃圾收集有关。

每当您在对象上调用init方法时,您就拥有它,并且您有责任在不再需要该对象时释放它。

当您调用任何其他类型的返回对象的方法时,该对象将添加到 a中,并且当池耗尽时NSAutoreleasePool它是d 。autorelease

您可以在此处获得更多见解。

因此,按照 Apple 的方式,如果您不想保存对象以供进一步使用,您可以调用fetchRequestWithEntityName而不用担心在方法调用结束时释放对象。如果要将其保存为实例变量,请调用initWithEntityName方法。它们当然可以互换,但这种方法遵循苹果在内存管理方面的指导方针。

-(void)myMethod {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  id obj1 = [[Object alloc] initWithEntityName:...];
  id obj2 = [Object fetchRequestWithEntityName:...];

  //obj1 retain count is +1
  //obj2 retain count is +0 (likely autoreleased)

  [pool drain];

  //obj1 still exists
  //obj2 is no longer valid; may or may not have been deallocated 
}

所以基本上,fetchRequestWithEntityName是通过以下方式实现的:

+(id)fetchRequestWithEntityName:... {
  return [[[self class] alloc] initWithEntityName:...] autorelease];
}
于 2012-04-27T12:00:42.613 回答