虽然我意识到一个是类方法,另一个是实例方法,但它们在 Apple 文档中具有完全相同的描述,所以我不太了解不同的语法/用例。
3 回答
它们的功能是等效的,但是类方法返回一个自动释放的对象。也就是说,它可能是按照以下方式实现的:
+ (NSFetchRequest *)fetchRequestWithEntityName:(NSString *)entityName {
return [[[NSFetchRequest alloc] initWithEntityName:entityName] autorelease];
}
这是 Objective-C 库中相当常见的模式,称为类工厂方法。
这两个 API 的主要区别如下:
fetchRequestWithEntityName
会给你一个自动释放对象,所以一旦事件循环结束,它将从内存中释放,直到你保留它。
但是initWithEntityName
会给你要释放的对象,否则会有内存泄漏。
根据您所说,如果它们确实具有相同的用例,则根据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];
}