Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Class_Object_Methods_Instance - Fatal编程技术网

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

Objective c 我需要一个很好的类比来理解类方法和实例方法,objective-c,class,object,methods,instance,Objective C,Class,Object,Methods,Instance,当我正在阅读的书深入研究NSNumber类并讨论可以调用它的所有不同方法时,我感到相当困惑。我有几个问题: 你不需要在基础课上调用一个典型的OLC或init吗? 2)在什么情况下你会使用,比如说,numberWithChar:与initWithChar相反(我认为这是最让我困惑的部分,我不确定我是否在我需要的层次上摸索这个概念,如果你们能帮我把它分解,我想这真的会帮助我克服这个驼峰 谢谢 Nick1)alloc和init几乎总是需要被调用numberWithChar是一种方便的方法,这意味着它为

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

你不需要在基础课上调用一个典型的OLC或init吗?

2)在什么情况下你会使用,比如说,numberWithChar:与initWithChar相反(我认为这是最让我困惑的部分,我不确定我是否在我需要的层次上摸索这个概念,如果你们能帮我把它分解,我想这真的会帮助我克服这个驼峰

谢谢

Nick

1)
alloc
init
几乎总是需要被调用
numberWithChar
是一种方便的方法,这意味着它为您调用
alloc
init
autorelease
,并返回autorelease实例

2) 由于
numberWithChar
返回一个自动删除的对象,这意味着除非您保留它(或者将它传递给类似
NSArray
的东西,它将
保留它),否则它将很快被销毁
initWithChar
返回一个
retain
-ed对象,这意味着您必须在处理完它后释放它

当我刚开始学习时,我发现使用
init
-
alloc
作为一种规则,而不是方便的方法是很有帮助的,因为它让我更加关注我的内存管理

在对这个问题的回答中,类方法和实例方法之间的区别从多个角度进行了阐述

编辑:

老实说,当我调用一个类方法时,比如说,
NSString
,我使用的类比是祈祷NSString之神赐予我一个全新的
NSString
。请注意,类方法几乎100%用于创建。e、 g.
alloc
是类方法,
stringWithFormat
是类方法,依此类推

是的,我知道这很荒谬。

类/实例类比 课程就像是一个类型房屋的蓝图。实例类似于实际的房屋。因此,对于单一类型的房屋,只能有一个蓝图,但可以有多个相同类型的实际房屋。此外,你可以有多个蓝图,每个蓝图描述了不同类型的房子

您可以使用的另一个类比是类类似于cookie切割器,而实例类似于cookie切割器制作的cookie

它如何适用于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:
返回一个自动删除的对象


必须分配和初始化所有对象。这包括基础类。

OK,第一件事:在Objto-C中,你不调用一个方法,你向一个对象发送一个消息。运行库查找方法并调用它们


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

这很有帮助,有没有其他东西可以帮助您理解类和实例方法在刚开始时是如何不同的?谢谢你的帮助。尼克…加上我荒谬的类比。。希望它有帮助:不,不,你向上帝祈祷给你一个例子。一旦你有了这个实例,你就可以向它发送消息了。