这是学习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之前是做了什么,使用初始化方法?嗯~,事实上NSMutableString,NSArray,每一个NS类,也会使用初始化。似乎是浪费了许多代码放在每个类的初始化方法里,对不对?也许是吧,这是为什么初始化通常只在根类NSObject里实现一次。由于许多类互相继承,一个为被创建并成为另一个的孩子,你类将自动获得访问你类的方法。
以 NSMutableString 为例, NSMutableString 认 NSString 作父, 这表示它继承于 NSString。然而,NSString认NSObject作父,这说明它继承于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.运算符、表达式、优先级等,算术运算符、算术表达式、强制类型转换运算符,自增自减运算符,位运算符、赋值运算符、关系运算符、布尔逻辑运算符等。
类接口(@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