作者邮箱:mc0066@gmail作者QQ:1300915166
至读者
对 难 对 步 IT行业的程序员们来说,完全不了解这个行业,第一份所从事的工作并不一定能成为自己以后会喜欢的工作。09年秋天,我还在
计算机学校做辅导老师时,接到了来自北京的电话。来电话的人是一位20出头的
年轻老板,他在北京和朋友一同经营一家从事MTK手机游戏开发的公司,他问我
是否有兴趣去北京工作,我当时立刻就同意了。转眼2年的时光过去了,虽然我已经离开了那家公司,到了一所从事IPHONE游戏开发的公司。但是,我很清楚如
果我最初能更加了解这个行业的话,我一定可以去一个自己喜欢也更加有希望当然,同时也为科技进步为
了让人类享受更加高质量的服务去做贡献。IPHONE是
一个很棒的平台,对于用户它是一个无论硬件还是软件都很漂亮、很强大、很易用的手机,对于开发者来说它是一个更加简单更加稳定的一个开发平台。我和大多
数人一样相信移动互联网是未来,而在IPHONE上开发应用和游戏也将会让人无
比的兴奋。但是作为程序员来说,首先你要学好Objective-C ^^
类的定义
Objective-C的类由2部分所组成:
1. @interface (接口) - 定义了类的组成结构,通常写在.件中。
2. @implementation (实现) - 包含类方法的实现代码,通常写在.m文件中。你可以这样来写interface:
@interface ClassName : ParentClass {
type var1;//对象变量
...
type varN;
}
- (id)initClassName;//对象方法
@end
@interface代表一个类定义的开始,而@end则代表类定义的结束。@符号是Objective-C引入的,用于和C语言代码区分,这样当编译器发现@符号时就知道这是Objective-C代码而不是C代码了。
接下来,我们分析一下上面的代码:
ClassName:是类的名字,它是一个标示符,你可以根据标示符命名规则任意取名字。不过,最好是首字母大写的形式,因为这是一种很好的代码风格。ParentClass:这是父类的名字,Objective-C中每个类都只能有1个父类,也就是说Objective-C是一种“单继承”的语言。
{}:大括号中包含的是对象变量,这些变量的默认访问权限为protected,也就是说只能对象方法可以使用它们。不过你可以指定访问权限,比如:public、private,之后会介绍这些。
-
(id)initClassName;:它是属于对象的方法,成员方法的访问权限都是public,也就是说在任何地方都可以访问到,你是无法改变它的。
现在我们看看OC中方法原型是什么样子的:
- (returnType)methodName:(type)par1 label1:(type)par2;
是不是看上去很繁琐?
不用担心,等你了解了就不觉得繁琐了反而会喜欢这种语法^^
我们从左向右分析以下它:
-:减号代表该方法是一个对象方法,也就是说只有实例化之后才能调用它。如果是加号(+)那就表示方法是属于类的,通过类就可以直接调用它,不用实例化。我们以上面代码来举个例子:好听的游戏id
//正确的调用方法
ClassName *obj = [[ClassName alloc] init];//先实例化对象
[obj method:1 label1:2];//然后再调用方法
//错误的调用方法
[ClassName method:1 label1:2];//把method当做类方法来调用了!
returnType:方法返回值的类型,可以是基本类型:int、float,也可以是对象类型。
methodName:方法名,它就是一个标示符,建议采用第一个单词小写之后单词首字母大写的形式,还是编码规范^^
(type)par1 label1:(type)par2;:这些是方法的参数列表,参数间使用空格间隔,label1是标签,你可以借此告诉调用者该参数的用途。这个参数是可以省略的,所以上面的方法也可以写成:
- (returnType)methodName:(type)par1 :(type)par2;
那么你会问了,为什么第一个参数没有标签啊?
其实是有的,第一个参数的标签就是方法名。这个方法的真正名字不是methodName,而是methodName:label1或methodName:(省略label1时)。
interface(接口)写好了,下面我们该写implementation(实现)了:
@implementation ClassName
- (id)initClassName {
self = [super init];
if(self) {
初始化你的对象变量
}
return self;
}
@end
在OC中使用@implementation关键字来定义类的实现,和@interface一样也使用@end表示定义的结束。
这里的ClassName就是你在@interface中写的类名,必须要一样,否则编译器可能会提示:“不到类的定义”。
我们来分析一下上面的代码:
id:这是OC中的泛型,其实它就是一个void *,也就是说id类型的变量可以指向任何类型的对象。
self:它表示当前对象,在上面它就表示ClassName类型的对象。self和JAVA中的this是同样的作用。你可以在对象方法里引用对象的变量和其它方法,比如:self.var1 = 10;
[self method];
上面代码中self接收初始化之后的对象,然后判断是否初始化成功,成功则返回给调用者。
super:代表父类。
构造方法
现在,你已经知道如何去写类了,接下来我们学习如何来实例化对象。OC通过构造方法来创建对象,构造方法和普通的方法没什么不同,不过通常它都有一些固定的步骤。
1.申请内存 - [self alloc]
2.初始化对象 - [super init]
3.设置对象变量
4.返回已创建对象 - return self
我们来看看构造方法的样子把,下面是它的基本组成结构:
- (id)构造方法名 {
self = [super init];//调用父类init方法初始化当前对象
if(self) {
这里来初始化你的成员变量
}
return self;//返回已创建的对象
}
是不是觉得self = [super init];不太好理解?其实,你这样写也没问题:
- (id)构造方法名 {
[super init];//调用父类init方法初始化当前对象
if(self) {
这里来初始化你的成员变量
}
return self;//返回已创建的对象
}
因为self本来就是指向当前对象的,而[super init]初始化也是在当前对象空间初始化的,因为父类的init函数我们也继承了。
对象的构造方法写好了,接下来看看如何通过构造方法来创建对象:ClassName *obj = [[ClassName alloc] initClassName]; initClassName就是ClassName的构造方法,这条代码执行之后obj就是我们所创建的对象,之后你可以使用obj来使用对象的变量和方法。
obj.var = 10;
[obj method];
这里要注意ClassName *obj定义对象的语法,在OC中所有的对象都必须是指针类型。因此你如下定义对象是错误的:
ClassName obj;
方法调用
OC提出了一种新的概念:我们可以向对象发送一个消息,然后该对象会响应这个
消息,然后返回给我们想要的结构。
OC通过以下语法调用对象的方法:
[obj method];
我们可以理解为:向obj对象发送了一个method消息。
如果你想给方法传递参数,你可以这样做:
[obj method:par1 label1:par2];
par1、par2:是我们传递给method方法的参数。
label1:该标签是在方法的定义中指定的,你不能随意写,如果写错了运行时将无
法到正确的方法,然后就会崩溃!
这样来接收方法返回的结果:
type result = [obj method];
这里有个有趣的地方,在OC中你可以向nil对象发送任意消息,这并不会导致程序
崩溃更不会抛出任何异常。比如:
[nil method];
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论