初次尝试Object-C,编码风格还真不习惯

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值