Object-C是Mac系统的默认编程语言,它是扩充了C的一门面向对象语言。基本C的标准的东西Objc都支持,虽然同样是一门面向对象的语言,可是和C++相比还是有很多的不同的地方,比如不支持命名空间,不支持多重继承等功能。不管怎样ios的盛行让它的排名已经升到TIOBE排行榜的前6位了。
可惜的是我一直以来还没有尝试过用它编程序,本来是举手之劳,今天就试一试吧,windows以及Linux系统下面可以安装GNUStep环境编写ObjectC,Mac下自然用自带的xcode集成编译环境了。
http://mobile.51cto.com/mobile/objc/ 这里有详细的objc教程
还是从最简单的Hello World开始
#import<stdio.h>
int main(int argc,char *argv[]){
printf("Hello World");
return 0;
}
可以看出没有什么变化,除了include关键字变成了import关键词以及后缀名不是.c而是.m以外。
下面写了一个简单的类,整体感觉风格和C++差别比较大,有点不习惯,不过用xcode写程序还是比较惬意的,如果它不经常卡死的话,呵呵
//尽量用import代替include
#import<stdio.h>
#import<Foundation/NSObject.h>
//类的定义,成员变量
@interface Car : NSObject
{
int number;
char name[50];
}
//记着用”-“号以及括号
-(void) setNumber: (int) num;
-(void) setName: (char *) na;
-(void) print;
-(int) getNumber;
-(char *) getName;
@end
//类的成员函数的声明
@implementation Car
-(void) setNumber: (int) num {
number = num;
}
-(void) setName: (char *) na {
strcpy(name,na);
}
-(void) print {
printf("id is %d and name is %s¥n",number,name);
}
-(int) getNumber {
return number;
}
-(char *) getName {
return name;
}
@end
int main(int argc,char *argv[]){
//alloc一个新的对象
Car *c = [[Car alloc] init];
//调用方法设置成员变量
[c setName: "Ford"];
[c setNumber: 521001];
//调用函数
[c print];
//调用方法获取成员变量
int id = [c getNumber];
char *name = [c getName];
printf("id=%d name=%s",id,name);
//与C,C++一样,申请的内存需要手动释放
[c release];
printf("Hello World");
return 0;
}
如何传递多个参数呢,语法规则也是怪怪的,如下面的例子
#import<stdio.h>
#import<Foundation/NSObject.h>
@interface Car : NSObject
{
int number;
char name[50];
}
//方法的实际名称叫做setNumber:andName
-(void) setNumber: (int) num andName: (char *) na;
-(void) print;
@end
@implementation Car
-(void) setNumber: (int) num andName: (char *) na {
number = num;
strcpy(name,na);
}
-(void) print {
printf("id is %d and name is %s¥n",number,name);
}
@end
int main(int argc,char *argv[]){
Car *c = [[Car alloc] init];
[c setNumber: 521001 andName: "Ford"];
[c print];
[c release];
return 0;
}
还可以再构造函数中实现设置默认值,首先需要实现构造函数如下:
#import<stdio.h>
#import<Foundation/NSObject.h>
@interface Car : NSObject
{
int number;
char name[50];
}
//构造函数
-(Car *) initNumber: (int) num andName: (char *) na;
-(void) setNumber: (int) num andName: (char *) na;
-(void) print;
@end
@implementation Car
-(Car *) initNumber: (int) num andName: (char *) na {
self = [super init];
if (self) {
[self setNumber:num andName:na];
}
return self;
}
-(void) setNumber: (int) num andName: (char *) na {
number = num;
strcpy(name,na);
}
-(void) print {
printf("id is %d and name is %s¥n",number,name);
}
@end
int main(int argc,char *argv[]){
Car *c = [[Car alloc] initNumber: 521001 andName: "Ford"];
[c print];
[c release];
return 0;
}
ObjectC里面的类成员变量默认是@protected类型,需要在外部访问需要设置为@public类型,如下所示
#import<stdio.h>
#import<Foundation/NSObject.h>
@interface Car : NSObject
{
@public
int number;
char name[50];
}
-(void) print;
@end
@implementation Car
-(void) print {
printf("id is %d and name is %s¥n",number,name);
}
@end
int main(int argc,char *argv[]){
Car *c = [[Car alloc] init];
c->number = 521001;
strcpy(c->name,"Ford");
[c print];
[c release];
return 0;
}
下面再来测试一下自定义异常抛错的例子,语法与C++基本一致,只是需要在关键词前加上@符号
#import<stdio.h>
#import<Foundation/NSString.h>
#import<Foundation/NSException.h>
#import<Foundation/NSObject.h>
#import<Foundation/NSAutoreleasePool.h>
int bigger(int a,int b){
if (a < 0 || b < 0) {
NSException *e = [NSException
exceptionWithName:@"negative number" reason:@"shall not be negative number" userInfo:nil];
@throw e;
}
return a>b?a:b;
}
int main(int argc,char *argv[]){
//这里用到OBJC的自动垃圾回收机制
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int a=-3,b=4;
int res;
@try {
res = bigger(a, b);
}
@catch (NSException * e) {
//打印出错信息
printf("%s: %s¥n",[[e name] UTF8String],[[e reason] UTF8String]);
}
@finally {
printf("end");
}
//释放堆栈
[pool release];
return 0;
}
//程序运行输出:negative number: shall not be negative number