当先锋百科网

首页 1 2 3 4 5 6 7

             这是学习Objective-C的第一天,也是入门的第一步。

  Objective-C是一门基于C语言的面向对象语言,它在现代计算机的主要作用于Mac OS X作为桌面语言以及作用于iPhone OS(亦称:iOS)。它原是NeXTSTEP 操作系统的主要语言,NeXTSTEP OS随后被苹果公司收购,并派生出Mac OS X,所以这可以很好地说明今天的苹果操作系统和它有异曲同工之妙。

  由于Objective-C是C语言的一个严格超集,所以我们可以在Objective-C文件里自由地使用C语言并会顺利编译通过。因为任何Objective-C的编译器会将C代码编译过去,也就是说,我们拥有通过Objective-C实现C的面向对象能力。Objective-C提供面向对象的能力。OOP是一种编程规范,它让开发者专注于软件设计中的对象和属性,而不是变量和函数。具体的说,OOP试图获取数据抽象,封装,模块化,多态和继承。

接口和实现

   当你用Objective-C创建或操作一个简单的类,默认下,你会看到两个文件:一个是实现文件(以.m为后缀名),另一个是接口文件(以.h为后缀名)。

  接口

1. #import <COCOA Cocoa.h>   
2.  
3. @interface Car : NSObject {   
4.  
5.    //This is where attributes go   
6.     float fillLevel;   
7.  
8. }   
9.  
10. //This is where methods go   
11. - (void)addGas;    
12.  
13.@end  

首先呢,我们引入提供大量可重用代码的Cocoa.h库,里面的代码都可以供我们在编写应用程序时使用。

  下一步,我们声明汽车接口,同时也把NSObject加入声明行里。对"NSObject”的添加意味着汽车类继承于NSObject类。关于继承,我们后续教程会更多的讨论。

  接着,声明实例变量"fillLevel”,为了更容易表现百分比,我们特意指定它为"float”类型。

  下一行,声明"addGas”方法,“”表示这是一个实例方法,而不是类方法。“(void)”部分意味着方法执行结束时不返回任何东西。如果方法要返回一个整型,把这部分替换为”(int)”,其他类型依此类推。最后,我们以分号结束方法的声明。

实现

1. #import "Car.h"    
2.  
3. @implementation Car   
4.  
5. -(void) addGas {   
6.     // code goes here to add gas   
7. }   
8.  
9. @end 

回顾:类&对象

类,就是封装过的数据和自定义方法的集合。一个类可能容纳许多不同各类的数据,类方法通常和这些数据有关联。在Objective-C之中,一个类通常由两个文件组成,一个接口文件和一个实现文件。这接口文件使用.h作后缀名,当我们使用这类时可以很快的找到方法和数据成员。这实现文件用.m作后缀名,它包含了大部分的代码,因为它包含了所有在接口文件中声明的方法的实现。

来自苹果的类

  在我们继续之前呢,我想分享一些苹果公司提供的通用类,但在开始之前,先来一小节历史课吧。

  许多苹果公司提供的类是以“NS”打头的,这是NextStep的风格了。当年乔帮主离开了苹果,他就建立了NeXT,随后建立运行之上的电脑工作站。运行在这些机器上的面向对象语言就被称为“NeXTSTEP“,”NS“就出自于此拉。当苹果收购了NeXTSTEP(另一堂历史课了),他们就决定把Mac OS X建立在NeXTSTEP之上。

  这里有几个例子,我们将会常见的通用类:

  • NSString                    是一不可变的文本字符串
  • NSMutableString      是一可变文本字符串
  • NSArray                      是一不可变的对象数组
  • NSMutableArray        是一可变的对象数组
  • NSNumber                  可容纳一数值

  随后,我们将学习更多,但以上的将会派上用场了。你也许会想知道什么是“可变”,什么是“不可变”,这确实是容易理解的问题。如果一个对象是不可变的,这意味着当我们创建一个对象并给它赋值时,它是静态的,这些值就不能改变了。如果对象是可变的,那它就是动态的,被创建后它的值仍可以改变。

指针和初始化

1. #import <Foundation/Foundation.h>   
2.  
3. int main (int argc, const char * argv[]) {   
4.  
5.    NSString *testString;   
6.    testString = [[NSString alloc] init];   
7.    testString = @"Here's a test string in testString!";   
8.    NSLog(@"testString: %@", testString);   
9.  
10.    return 0;   
11.  
12. } 
打开Xcode建立一文件, File> New Project> Mac OS X> Application> Command Line Tool> Type:Foundation ,接着在项目里编辑接口文件(.m为后缀的)。

继承

     还记得创建我们的NSString之前是做了什么,使用初始化方法?嗯~,事实上NSMutableStringNSArray,每一个NS类,也会使用初始化。似乎是浪费了许多代码放在每个类的初始化方法里,对不对?也许是吧,这是为什么初始化通常只在根类NSObject里实现一次。由于许多类互相继承,一个为被创建并成为另一个的孩子,你类将自动获得访问你类的方法。

  以 NSMutableString 为例, NSMutableString  认  NSString 作父,   这表示它继承于 NSString。然而,NSStringNSObject作父,这说明它继承于NSObject

Objective-C的方法调用

A.调用方法:[实例 方法]或者[类名 方法名]

1)一个方法可以返回值:变量=[实例 方法];

2)允许在一个方法中调用嵌套另一个方法调用,但最好不超过两个,比如:

[NSString stringWithFormat:[test format]];

3)self可以调用本类中的方法,比如:

-(BOOL)isQualified{//年龄满足条件吗?

return ([self age]>21);

}

B.输入和输出数据

NSLog(@"当前的日期是:%@",[NSDate date]);

NSLog(@"a=%i,b=%i,c=%i",a,b,c);

C.变量和表示符

在Objective-C中,用于标识变量名、接口名、方法名、类名的有效字符称为标识符。还有一些预定义标识符,具体有哪些可以

参阅相关资料。

重要的还有指令符@,具体指令有@"char",@implementation等。

D.数据类型及其转换

类型int等、实型double等、字符型char、字符串" "、id类型等。枚举类型:enum.还有BOOL、SEL、Class、typedef、nil、NiL等


数据类型转换char,short--->int--->unsigned--->long--->double<---float

E.运算符、表达式、优先级等,算术运算符、算术表达式、强制类型转换运算符,自增自减运算符,位运算符、赋值运算符、关系运算符、布尔逻辑运算符等。

Objective-C程序结构;

类接口(@interface):定义了类的数据和方法,但是不包括方法的实现代码,其文件通常保存在.h文件中。定义的语法格式如下所示:

@interface 类名:父类名{

              变量定义;

}

             方法定义;

@end

例如:

@interface Member:NSObject{

           NSString* name;

           int      age;

}

//方法定义,例如:

-(NSString*)name;

-(int) age;

-(void)setName:(NSString*)input;

-(void)setAge: (int)input;

@end

这其中:

-指方法类型

(void)指返回类型

setName指方法名称

:方法接受参数

(NSString)指参数类型;

input指参数名。

类实现(@implementation):包含了实现类方法的代码,其文件一般保存在.m文件。类的实现的语法如下:

@implementation 类名

              方法实现代码;

@end

例如:

@implementation Member

-(NSString*)name{

   return name;

}

-(int)age{

          return age;

}

-(void)setName:(NSString *)input{

      [name autorelease];

      name= [input retain];

}

-(void)setAge:(int)input{

age=input;

}

@end

应用程序:调用类来完成一些实际操作的应用程序。

int main(int argc,const char *argv[]){

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];//自动释放池

Member* member=[[Member alloc]init];//定义一个Member类型的变量

[member setName:@"sam"];

[member setAge:36];//调用member的相关方法为member的两个属性设置值;

NSLog(@"%@",[member name]);

NSLog(@"%i,[member age]);//打印相应的属性值;

[member release];//释放对象的内存空间,

[pool drain];//清空池。

@end