iphone学习笔记(三)

3

类、对象、方法

在本章中,你讲学习一些面向对象编程的技巧及如何在objective-c中编写类。

什么是对象

我们通过一个日常的例子来解释它。我们假设您拥有一辆轿车,很显然这辆车就是一个对象。现在你没有任何一辆车,那么你的车有可能在底特律、日本或者世界上任何一个地方的工厂里制造中,是个抽象的。 而相应的你可能会去驾驶它,给它加油,洗车等等,这些都是针对于这个对象发生的动作。(这些,类,对象等含义与其他面向对象编程语言相同,因此定义方面也就不多说了)

现在通过实际例子来快速了解吧。下面假设你不了解类、方法等。你写的程序可能是这个样子的:

下面是面向对象方式的写法。

在objective-c中,类的声明分为两部分。

  1. 定义部分:以@interface开头,@end结尾。定义了类中的成员,方法,方法的返回类型,参数等。
  2. 实现部分:类名同声明时的类名相同,如下例中的 Fraction 。对于定义中的实现。
#import<Foundation/Foundation.h>
@interface Fraction:NSObject
{
     int numerator;
     int denominator;
}
-(void)  print;
-(void)  setNumerator:(int) n;
-(void)  setDenomainator:(int) d;
@end

@implementation Fraction
-(void) print
{
   NSLog(@"%i/%i",numerator,denominator);
}
-(void) setNumerator:(int) n
{
    numerator=n;
}
-(void) setDenominator:(int) d
{
    denominator=d;
}
@end

int main(int argc,char *argv[])
{
   NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init]
  Fraction *myFraction;
  //创建一个实例
  myFraction=[Fraction alloc];
  myFraction=[myFraction init];
  //给前面定义的变量赋值
  [myFraction setNumerator:1];
   [myFraction setDenominator:3];
   //显示输出结果
  NSLog(@"The value of myFraction is:");
  [myFraction print];
  [myFraction release];
  [pool drain];
  return 0;
}

我为了熟悉这个定义调用等方法,自己照葫芦画瓢做了一个,调试的时候总是报错:cannot init a class object  找了半天才发现,原来是创建实例的时候如下。

//创建一个实例
  myFraction=[Fraction alloc];
  myFraction=[myFraction init];

我误将myFraction=[myFraction init];  写成 myFraction=[Fraction init];  了  myFraction才是实例,Fraction是类名,怪不得会报那个错呢。呵呵,不过这样对于objective-c中对于对象的初始化有了更深的印象,出点错也未尝不是件好事。

现在具体分析下类的定义,及相关使用方法。

首先,定义一个类需要,给它取一个名字(这与所有面向对象编程语言相同),然后在objective-c中,需要指定该类的父类,也就是继承自哪个类。如下

@interface Fraction:NSObject

NSObject相当于c#中的object,是根类。
然后在大括号中间类成员,变量的定义。如下(返回值,跟变量名,同其他语言一样,没什么好说的)

 int numerator;
 int denominator;

接着是方法的定义。如下共定义了三个方法:print、setNumerator、setDenomainator   其中 (void)前面的 - 号表示表示该方法是实例方法,相应的 + 表示类方法。 这里是与我之前接触的编程语言大不相同的地方。 (void)不用多说,大家应该相当熟悉表示方法的返回类型。接着是方法名称如print、setNumerator等。

-(void)  print;
-(void)  setNumerator:(int) n;
-(void)  setDenomainator:(int) d;

需要注意的是objective-c中参数的前面需要有冒号 : 并且多个参数的话需要有多个冒号。如:

-(void) exampleMetho:(int) weight zhongliang:(int) height 

在weight后面的zhongliang是参数签名用来标示参数作用的。
然后是实现部分@implementation  名称需要与定义部分的名称相同@implementation Fraction 。接着是实现之前所定义方法的具体代码实现。

最后是main函数中,具体的调用过程。

NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init]  创建工程后 这一段系统会自动添加,具体原理等稍后的内存管理中会详细解释。

创建实例:Fraction *myFraction=[fraction allock]  等同于:

Fraction *myFraction;
myFraction=[Fraction alloc];
myFraction=[myFraction init];

释放内存:[myFraction release]; 这个是与其他自动垃圾回收不同的地方。

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章