我需要一个很好的类比来理解Class方法和实例方法

时间:2010-01-09 06:16:59

标签: objective-c class object methods instance

我正相当困惑,因为我正在阅读的书正在深入研究NSNumber课程,并讨论了你可以调用它的所有不同方法。我有几个问题:

1。)你不必在基础课上调用典型的alloc或init吗?

2.)在什么情况下你会使用numberWithChar:而不是initWithChar(我认为这是让我搞砸了最多的部分,不是很确定我在这个级别上需要这个概念如果你们有人可以为我分解,我认为这真的有助于我克服这个傻瓜。

谢谢,

尼克

3 个答案:

答案 0 :(得分:3)

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

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

我在开始时发现使用init - alloc作为规则很有帮助,而不是方便的方法,因为它让我密切关注我的记忆管理。 / p>

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

编辑:

老实说,我在调用类方法时使用的类比,比如NSString,正在向NSStrings的神祈祷,给我一个宏伟的新NSString。请注意,类方法几乎100%用于创建。例如alloc是一种类方法,stringWithFormat是一种类方法,依此类推。

是的,我知道这太荒谬了。

答案 1 :(得分:3)

班级/实例类比

类似于类型房屋的蓝图。实例就像实际的房子。因此,您只能为单一类型的房屋设置一个蓝图,但您可以拥有多个相同类型的实际房屋。此外,您可以拥有多个蓝图,每个蓝图描述不同类型的房屋。

你可以使用的另一个类比是类就像饼干切割器一样,实例就像用曲奇饼干制作的饼干。

它如何适用于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)

好的,首先:在Objective-C中,你没有调用方法,你向对象发送消息。运行时查找方法并调用它们。

将课程视为工厂可能有助于您。事实上,多年前,我们曾经将类方法称为工厂方法。