【问题标题】:I need a good analogy to make sense of Class methods vs. instance methods我需要一个很好的类比来理解类方法与实例方法
【发布时间】:2010-01-09 06:16:59
【问题描述】:

当我正在阅读的书深入研究 NSNumber 类并谈论您可以调用它的所有不同方法时,我感到相当困惑。我有几个问题:

1.) 您不必在基础类上调用典型的 alloc 或 init 吗?

2.)在什么情况下你会使用 numberWithChar: 而不是 initWithChar (我认为这是最让我困惑的部分,我不确定我是否在我需要的水平上摸索这个概念,如果你们可以为我分解它,我认为它真的会帮助我克服这个驼背。

谢谢,

尼克

【问题讨论】:

    标签: objective-c class object methods instance


    【解决方案1】:

    类/实例类比

    类就像打字屋的蓝图。实例就像真正的房子。因此,对于一种类型的房屋,您只能拥有一个蓝图,但您可以拥有多个相同类型的实际房屋。此外,您可以有多个蓝图,每个蓝图描述不同类型的房屋。

    您可以使用的另一个类比是,类就像饼干切割器,而实例就像由饼干切割器制成的饼干。

    它如何应用于 Objective-C

    代码中的每个类都有一个“类对象”。要引用类对象,只需使用类名。 alloc 是一个分配新实例的类方法,如下所示:

    MyWidget* w = [MyWidget alloc];

    但是,alloc 不会初始化类,因此不会设置任何成员变量。 init 是一个实例方法,它将初始化一个新分配的实例。所以要分配和初始化一个新实例,你可以这样做:

    MyWidget* w = [[MyWidget alloc] init];

    相当于这个:

    MyWidget* w = [MyWidget alloc]; //alloc is being called on the class
    w = [w init]; //init is being called on the instance
    

    另一种常见的类方法是工厂方法,如numberWithChar:。这基本上就是numberWithChar: 所做的:

    +(NSNumber*) numberWithChar:(char)c;
    {
        return [[[NSNumber alloc] initWithChar:c] autorelease];
    }
    

    唯一真正的区别是numberWithChar: 返回一个自动释放的对象。

    所有对象都必须被分配和初始化。这包括基础课程。

    【讨论】:

      【解决方案2】:

      1) allocinit 几乎总是需要被调用。 numberWithChar 是一个方便的方法,这意味着它会为您调用allocinitautorelease 并返回自动释放的实例。

      2) 由于numberWithChar 返回一个自动释放的对象,这意味着除非您保留它(或将其传递给NSArray 之类的东西,这将retain 它),它很快就会被销毁。 initWithChar 返回一个retain-ed 对象,这意味着你必须在完成后释放它。

      我刚开始的时候发现使用init-alloc作为规则是有帮助的,而不是方便的方法,因为它让我密切关注我的内存管理。

      What is the difference between class and instance methods?这个问题的答案中从多个角度解决了类和实例方法之间的区别@

      编辑:

      老实说,当我调用一个类方法时,我使用的类比是 NSString,是祈求 NSStrings 之神赐予我一个宏伟的新 NSString。请注意,类方法几乎 100% 用于创建。例如alloc 是类方法,stringWithFormat 是类方法,依此类推。

      是的,这很荒谬,我知道。

      【讨论】:

      • 这很有帮助,当您刚开始时,还有什么可以帮助您了解类和实例方法的不同之处吗?感谢帮助。尼克
      • ...添加了我荒谬的类比..希望它有所帮助:D
      • 不不,你祈求NSStrings之神给你一个实例。拥有实例后,您可以向它发送消息。
      【解决方案3】:

      好的,第一件事:在 Objective-C 中,您不调用方法,您向对象发送消息。运行时查找方法并调用它们。

      将类视为工厂可能会有所帮助。事实上,多年前,我们曾经将类方法称为工厂方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 2013-08-15
        • 1970-01-01
        • 2016-02-10
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        相关资源
        最近更新 更多