【问题标题】:InitWith Methods vs. Factory MethodsInitWith 方法与工厂方法
【发布时间】:2010-07-18 00:42:31
【问题描述】:

我正在学习 ObjC 和 Cocoa,这也是我第一次认真涉足编程领域。

我对在实例上调用的 initWith 方法和在类上调用的工厂方法之间的区别感到困惑。

首先,为什么它们被称为“工厂”方法,我称之为“InitWith”方法是否有合适的术语?

其次,功能上的区别是什么?仅仅是内存管理的影响(工厂方法返回一个自动释放的对象)吗?

例如,[NSString stringWithString: (NSString*)aString][[NSString alloc] initWithString: (NSString*)aString] 之间的真正区别是什么?

【问题讨论】:

    标签: objective-c cocoa class methods instance


    【解决方案1】:

    Cocoa 的object ownership policy 中描述了这些方法之间的区别。你拥有从 -initWithString: 返回的对象,因此必须释放它,但你不拥有从 +stringWithString 返回的对象,因此不需要释放它(此外,如果你确实想获得它的所有权,你必须保留它)。

    调用工厂方法是因为它们为您返回一个已经创建的对象,通常带有您提供的用于配置对象的参数,以方便程序员。

    【讨论】:

      【解决方案2】:

      关于你的例子

       [[NSString alloc] initwithString: (NSString     
      *)aString];
      

      当您执行分配时,您会在内存中为字符串放置一个空间,因此分配。然后告诉它使用等于 aString 的字符串进行初始化。 (NSString *) 是对象类型的标识符,因此您告诉它 aString 被声明为 NSString。

      我通常会做类似的事情

         NSString * aString = @"String value";
      

      声明aString等于什么。

      如果您将某些内容分配到内存中以便管理它,您需要在正确的时间释放它,例如

         -(void) dealloc {} 
      

      你的代码部分

      有关 NSString 的所有内容都可以在 Apple 的此文档中进行解释 NSString

      【讨论】:

      • 这适用于你们,Rugluds 和 Audacitor:在发送 initWithString: 消息时,您不需要包含 (NSString *)。只有方法的声明需要它(指定方法期望的类型)。当您将其作为消息的一部分包含时,您将aString 值转换为NSString *。如果aStringNSString *,那么这没有任何作用并且是不必要的;如果它是别的东西,那么强制转换仍然不会做任何有用的事情:它会关闭编译器,但你会在运行时崩溃。
      【解决方案3】:

      主要区别在于

       [NSString stringWithString:
        (NSString*)aString] 
      

      返回一个自动释放的字符串,您无需担心其内存管理,而

          [[NSString alloc] initWithString: 
           (NSString*)aString]
      

      返回一个你负责释放的字符串。基本上前者是后者的捷径,加上自动释放。

      【讨论】:

      • 好吧,“你不必担心谁的内存管理”并不是故事的全部,并且可能会让新手误入歧途......例如,如果您将结果分配给实例变量 ( 1)然后你会想要保留类方法的结果,否则你会发现当你访问你的实例变量时它会消失。对于那些刚接触 ObjC/Cocoa 的人来说,这是一个典型的错误。 (1) 一个不是具有合成 setter 的属性的实例变量被设置为通过属性属性保留。
      • 另一个常见的错误是将实例变量与属性混淆。您为属性声明的内存管理策略(例如retain)对实例变量没有影响;对实例变量的赋值总是没有副作用,包括没有保留或复制。因此,在分配给 ivar 时,您需要自己保留或复制该值。只有分配给属性才能为您做到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      相关资源
      最近更新 更多