作者iasm (魔术研究员)
看板MacDev
标题Re: [问题] 类别方法与实体方法到底有什麽差别?
时间Thu May 6 15:20:26 2010
※ 引述《aecho (星空下的鲔鱼)》之铭言:
: ※ 引述《iasm (魔术研究员)》之铭言:
: : 我从书上看到
: : -(void) method;是一个实体方法
: : +(void) method1;是一个类别方法
: : 但是我不太了解的是
: : 我在书上看到一个范例
: : @interface Fraction: NSObject
: : {
: : int numerator;
: : int denominator;
: : }
: : -(void) somemethod;
: : -(void) somemethod1;
: : -(void) somemethod2;
: : @end
: : 今在使用Fraction此定义的类别时
: : 一定会呼叫
: : Fraction *frac1=[ [Fraction alloc] init];
: : [Fraction alloc]此为Fraction使用一类别方法 alloc 配置记忆体
: : 完成後,[Fraction alloc]即为一(实体)instance
: : 并再使用实体方法 init
: : 但我的问题就在於在我当初定义Fraction此类别,并没有”定义”alloc与init方法
: : 当然我有看到范例是有在自行定义的类别中定义init方法
: : 所以我猜想,因为Fraction类别是继承至NSObject类别
: : 而NSObject类别中,有定义一类别方法alloc及一实体方法,它们都是初始化所必须的
: : 但是我们也可以在自已定义的类别,例(Fraction)中overide alloc及init,目的是产生我们需要的特定功能,例如在init中给予成员变数特定的”初值”
: : 请问各位,我这样对类别方法与实体方法的理解是正确的吗?
: 该class继承了NSObject,所以是用了NSObject里的alloc和init,
: 另外,obj-C里所有的method都是dynamic binding,
: 简单来说,都相当於C++里的virtual function。
据我的了解,virtual function指的是若子类别与父类别具有同一函数
由子类别所产生的物件,所呼叫的函数是此物件所属的"子类别"的"那一个"
多载函数,对应您所说的dynamic binding,可不可以说,此物件所使用
的函数是实际执行时才会决定,而不是编辑时就可以决定呢?
: 所以你常会看到
: - (id)init
: {
: if (self = [super init]) { ... }
: return self;
: }
: 用[super init]呼叫super class里的init method。
: +和-的差异,+相当於C++里的static function。
: 主要就是 + 可以直接用,而 - 一定要使用於一个被alloc且init後的object上。
看到此句说明,我终於完全了解了,原来就是c++ 类别里的
static member function,不过以上范例里if里面判断self=[super init]
的意思我不太了解,後面还return self我不太懂此函式内容在干嘛
因为据我了解,-init()的最主要功能是给予初值,那
if(self=[super init])的目的是?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.96.39.8
1F:→ uranusjr:怕发生一些莫名其妙的事情产生一些错误的东西 05/06 18:57
2F:→ uranusjr:其实不加 if 也不会怎样... 05/06 18:57
3F:推 aecho:virtual那边,你可以把所有的function都看成内建宣告 05/07 07:28
4F:→ aecho:virtual在前面…也就是每个-的method,都是用virtual宣告的 05/07 07:29
5F:→ aecho:而因为obj-C是单一继承,C++是多重继承~~ 05/07 07:29
6F:→ aecho:obj-C用super就可以找到super class,C++必须明表明是哪个 05/07 07:30
7F:→ aecho:super class。 05/07 07:30