Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 除了语法之外,将初始化方法作为实例或类方法编写有什么区别吗?_Objective C_Syntax_Initialization - Fatal编程技术网

Objective c 除了语法之外,将初始化方法作为实例或类方法编写有什么区别吗?

Objective c 除了语法之外,将初始化方法作为实例或类方法编写有什么区别吗?,objective-c,syntax,initialization,Objective C,Syntax,Initialization,以下是作为类方法的初始化: + (instancetype)imageEditorForDocument:(ImageDocument*)imageDocument { ImageEditorViewController* result = nil; result = [[ImageEditorViewController alloc] initWithNibName:@"ImageEditorViewController"

以下是作为类方法的初始化:

+ (instancetype)imageEditorForDocument:(ImageDocument*)imageDocument
{
   ImageEditorViewController* result = nil;
   result = [[ImageEditorViewController alloc] initWithNibName:@"ImageEditorViewController"
                                                        bundle:[NSBundle mainBundle]];

   if ( result )
   {
      result.imageDocument = imageDocument;
   }
   return result;
}
下面是一个作为实例方法的初始化:

- (instancetype)initWithDocument:(ImageDocument *)imageDocument
{
   self = [[ImageEditorViewController alloc] initWithNibName:@"ImageEditorViewController"
                                                       bundle:[NSBundle mainBundle]];

   if( self )
   {
      self.imageDocument = imageDocument;
   }
   return self;
}
据我所知,唯一的区别是,当使用类初始值设定项时,发送方不需要调用
alloc

但还有其他原因吗

还有一个附带问题作为类方法的初始值设定项是否有名称? 类似于
NSColor

+ (NSColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_MAC(10_9);

与手动引用计数(MRC)不同的是,factory方法通常返回自动删除的实例,而instance方法返回调用方现在拥有的实例

使用自动引用计数(ARC),这种差异现在从调用代码中隐藏

因此,唯一的区别是调用方的方便性,以及类的作者编写可选工厂方法的更多工作

顺便说一句-您的实例方法初始值设定项不正确。它应该更像这样(不是设置
self
的正确方法):

鉴于此,您的工厂方法应该是:

+ (instancetype)imageEditorForDocument:(ImageDocument*)imageDocument
{
   ImageEditorViewController* result = [[[self class] alloc] initWithDocument:imageDocument];

   return result;
}

与手动引用计数(MRC)不同的是,factory方法通常返回自动删除的实例,而instance方法返回调用方现在拥有的实例

使用自动引用计数(ARC),这种差异现在从调用代码中隐藏

因此,唯一的区别是调用方的方便性,以及类的作者编写可选工厂方法的更多工作

顺便说一句-您的实例方法初始值设定项不正确。它应该更像这样(不是设置
self
的正确方法):

鉴于此,您的工厂方法应该是:

+ (instancetype)imageEditorForDocument:(ImageDocument*)imageDocument
{
   ImageEditorViewController* result = [[[self class] alloc] initWithDocument:imageDocument];

   return result;
}

是的,有一个很大的区别。例如,如果实现工厂方法(类方法),您可以选择返回对象的已存在实例(例如,从某种缓存),而不是创建新实例。假设您有一个初始化成本很高的类
Country
。因此,编写以下factory方法,该方法首先查找缓存,并且仅当它没有找到创建新对象的国家时:

+(instancetype) countryForCountryCode: (NSString *)countryCode 
{
    Country *country = ... // ask our "CountryCache" if we already have a cached instance of the country
    if (!country) {
        country = [[Country alloc] init];
        // Here you would also set up the new Country object, or even write a "private" initializer
        // You would also add the new instance to the cache here
    }
    return country;
}
另一方面,当您选择“常规”初始值设定项时,调用方在调用初始值设定项之前总是通过
alloc
创建了一个新实例,而您将无法返回缓存对象


最后,我只记得我个人在处理持久对象时使用工厂方法(如果不使用CoreData)。因此,如果我想从数据库中获取一个新对象,我通常会实现一个名为“load”的工厂方法。为了在数据库中实际创建一个新记录,我将实现另一个名为“create”的工厂方法。如果您在这里使用初始值设定项,它将变得非常混乱。

是的,有一个主要区别。例如,如果实现工厂方法(类方法),您可以选择返回对象的已存在实例(例如,从某种缓存),而不是创建新实例。假设您有一个初始化成本很高的类
Country
。因此,编写以下factory方法,该方法首先查找缓存,并且仅当它没有找到创建新对象的国家时:

+(instancetype) countryForCountryCode: (NSString *)countryCode 
{
    Country *country = ... // ask our "CountryCache" if we already have a cached instance of the country
    if (!country) {
        country = [[Country alloc] init];
        // Here you would also set up the new Country object, or even write a "private" initializer
        // You would also add the new instance to the cache here
    }
    return country;
}
另一方面,当您选择“常规”初始值设定项时,调用方在调用初始值设定项之前总是通过
alloc
创建了一个新实例,而您将无法返回缓存对象


最后,我只记得我个人在处理持久对象时使用工厂方法(如果不使用CoreData)。因此,如果我想从数据库中获取一个新对象,我通常会实现一个名为“load”的工厂方法。为了在数据库中实际创建一个新记录,我将实现另一个名为“create”的工厂方法。如果您在这里使用初始值设定项,它将变得非常混乱。

它被称为工厂方法。它被称为工厂方法。感谢rmaddy:)而且我的错误代码是错误的——我实际上只是复制粘贴了工厂方法,并将其更改为与实例初始化类似的形式——但忽略了这一部分。感谢您的更正^^请参阅我的最新更新。您的工厂方法也错误。不过,实例初始值设定项在当前代码中不存在。因此,您建议我创建实例初始值设定项方法,然后将工厂方法更改为调用该方法?但我猜在这一点上,如果实例初始值设定项存在,工厂方法就没有理由了?这是标准模式。工厂方法通常只是调用实例初始值设定项的一种方便。就像你给出的“NSColor”例子一样。它基本上不需要调用
alloc
。在ARC时代,对这些方便的工厂方法的需求要小得多。感谢rmaddy:)和我的错误代码——我实际上只是复制粘贴了工厂方法并将其更改为实例初始化的样子——但忽略了这一部分。感谢您的更正^^请参阅我的最新更新。您的工厂方法也错误。不过,实例初始值设定项在当前代码中不存在。因此,您建议我创建实例初始值设定项方法,然后将工厂方法更改为调用该方法?但我猜在这一点上,如果实例初始值设定项存在,工厂方法就没有理由了?这是标准模式。工厂方法通常只是调用实例初始值设定项的一种方便。就像你给出的“NSColor”例子一样。它基本上不需要调用
alloc
。在ARC时代,对这些便利工厂方法的需求要少得多。我不确定我是否理解。这个概念听起来很正确,但我并不完全正确。是什么阻止您返回缓存中的缓存对象