作者aecho (星空下的鲔鱼)
看板MacDev
标题Re: [问题] 类别方法与实体方法到底有什麽差别?
时间Thu May 6 13:07:13 2010
※ 引述《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。
所以你常会看到
- (id)init
{
if (self =
[super init]) { ... }
return self;
}
用[super init]呼叫super class里的init method。
+和-的差异,+相当於C++里的static function。
主要就是 + 可以直接用,而 - 一定要使用於一个被alloc且init後的object上。
obj-C里可以初始化的地方还蛮多的,
不见得一定会从init来初始化该object…
所以有时候为了明确的表示该物件不能用init初始的话,
我会这样做…
-(id)init
{
// 引发exception
...
return nil;
}
--
Luke: All right, I'll give it a try.
Yoda:
No. Try not. Do... or do not. There is no try.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.120.59.242