1

我正在阅读作为设计模式的objective-c中的类工厂方法,并且有些困惑。为简单起见,我使用 UIColor 作为我的问题示例,但如果其他类工厂方法有所不同,请告诉我。基本概念:

UIColor *white = [UIColor whiteColor]; 

我知道这结合了分配和初始化。我读过的一些文档在自动引用计数之前是较旧的,并且指的是它是使用自动释放制作的(我不熟悉没有使用 MRC 的东西)。我试图了解这与自动引用计数和单例有何关系。例如,如果我这样做:

UIColor *whiteSquare = [UIColor whiteColor]; 
UIColor *whiteBall = [UIColor whiteColor]; 

我是否只保留一个对象,有点像单身人士?

什么时候发布?当所有由 whiteColor 组成的对象超出范围或设置为零时?

我提到了创建新实例的类方法,但有些答案是指 ARC 而有些不是。

上述线程中的最终答案说:

“使用 ARC 和最新编译器的现代方法是:

+ (instancetype) myClassWithString:(NSString *)string {
return [[MyClass alloc] initWithString:string];
}

无需使用 ARC 自动释放。”

我只是不清楚这个自动发布意味着什么。我阅读了一些苹果文档,他们表示这是图片的一部分。通过上面的例子,如果这是真的,如果这是真的,它将创建变量的多个实例。该方法是一个类方法,但上面的代码暗示它不是静态赋值。

这就是类工厂方法的全部含义吗?它像任何其他初始化一样返回一个对象,但它是一个静态或类方法,它结合了分配和初始化?自动释放如何发挥作用?我很难理解为什么它不能只为所有对象创建一种白色来共享。这似乎更有效率。但是让我问这个问题的原因是要了解类工厂方法的设计模式以及它显然是以一种或另一种方式完成的。

ARC 和 autorelease中,最佳答案是“ARC 仍然使用 Autorelease 作为一种机制,此外 ARC 编译代码旨在与 MRC 编译代码无缝互操作,因此自动释放机制就在身边。” 所以我仍然想知道如果我为两个对象要求两次 whiteColor 是否有一两个副本。以及什么时候发布。在上面的代码示例中,它似乎是一个像其他任何对象一样的对象,但在上面的帖子中它不同。

上述线程中的第二个答案说“自动释放用于返回的函数对象,因此调用者不拥有所有权,被调用者将在未来释放该对象。” 那么这里的动机又是什么?UIColor 类是否希望所有被调用者只有一个对象?这个因素如何融入类工厂设计模式?

UIColor 的类参考https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIColor_Class/index.html只是说函数 whiteColor:“返回值 UIColor 对象。”

我没有在那里找到答案。

在做更多研究时,我看到“类工厂方法的另一个目的是确保某个类(例如 NSWorkspace)提供单例实例。” https://developer.apple.com/library/ios/documentation /General/Conceptual/CocoaEncyclopedia/ClassFactoryMethods/ClassFactoryMethods.html

这是进一步研究的结果。我打算将任何其他问题移至另一个帖子。

4

1 回答 1

2

像工厂方法[UIColor whiteColor]不一定每次都分配。他们可能每次都分发相同的实例(单例)。所以很有可能返回的对象永远不会被释放。当您[UIColor whiteColor]多次调用时,您可能每次都获得不同的对象,或者您可能每次都获得相同的对象,这是未定义的。但这不是您需要或应该关心的(通常)。

实际上,就内存管理而言,“工厂”方法并没有什么特别之处。与所有方法相同的规则适用。在这种情况下,您必须假设返回的对象是自动释放的;你不“拥有”它。规则是:

如果它的方法名称以以下方式开头,则您“拥有”该对象(使用非 ARC 时必须释放它):

  • 新的
  • 分配
  • 复制

由于这些工厂方法以您不拥有它们开始,因此您不会自己释放它们(retain当然,除非您首先释放它们)。

使用 ARC,您不再需要考虑保留/释放/自动释放。您更关心“弱”和“强”引用。因此,如果您需要保留这些对象,则需要将它们分配给强属性或实例变量,否则它们可能会被自动释放机制释放。

于 2014-11-01T09:33:53.073 回答