UICololor类工厂方法 - 什么时候发布

时间:2014-10-31 04:34:53

标签: objective-c class-factory

我在Objective-c中将类工厂方法作为一种设计模式阅读并且有些混乱。我使用UIColor作为简单问题的示例,但如果事情因其他类工厂方法而异,请告诉我。基本概念:

UIColor *white = [UIColor whiteColor]; 

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

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

我只保留一个像单身人士的对象吗?

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

我提到了Class methods which create new instances但是对我来说有点困惑,有些答案指的是ARC,有些则没有。

上述主题中的最终答案是:

"使用ARC和最新编译器执行此操作的现代方法是:

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

无需使用ARC自动发布。"

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

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

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

上述主题中的第二个答案说" autorelease用于返回的函数对象,因此调用者不会获得所有权,被调用者将来会释放该对象。"那么这里的动机又是什么呢?类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

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

1 个答案:

答案 0 :(得分:2)

[UIColor whiteColor]这样的工厂方法不一定每次都分配。他们可能每次都发出相同的实例(单身)。因此,返回的对象很可能从不解除分配。当您多次调用[UIColor whiteColor]时,每次都可能获得不同的对象,或者每次都可能获得相同的对象,但未定义。但这并不是你需要或应该关心的事情(通常)。

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

你"拥有"对象(如果使用非ARC,则必须释放它)如果它的方法名称以:

开头
  • 的alloc
  • 复制

由于这些工厂方法都不是你不拥有它们,因此你不会自己释放它们(当然,除非你先retain它们。)

使用ARC,保留/释放/自动释放是你不再需要考虑的事情。你更关心"弱"和#34;强大的"引用。因此,如果您需要这些对象,您需要将它们分配给强属性或实例变量,否则它们可能会被自动释放机制解除分配。