Objective-C最基础语法之Class定义

移动开发 iOS
在Objective-C里面一个类的构成一般由两部分组成,一个是成员和方法声明的头文件(.h),一个是类方法实现的文件(.m)文件。

Objective-C最基础语法之Class定义是本文要介绍的内容,Objective-C是面向对象的语言,因此的定义是基础中的基础。Objective-C是C的超级,但是在语法上跟C又有一些不同,尤其是在对属性和方法的访问上,有其非常特殊的语法。看过Objective-C的代码都知道,里面会有很多的中括号,这是Objective-C独有的。

Objective-C里面一个的构成一般由两部分组成,一个是成员和方法声明的头文件(.h),一个是方法实现的文件(.m)文件。当然你也可以把的声明写在.m文件里面,但是这样就是私有的成员,其他就不能使用了。成员的声明是通过interface来实现的,懂C#的朋友应该知道C#里面也有interface,但是Objective-C里面的interfacegen跟C#里面是完全是两回事,Objective-C里面的interface就是用来定义一个里面有那些属性和方法的。

一个类的方法有两种,一种是类方法,一种是实例方法。类方法有点像静态方法,它属于一个类,而不是属于一个类的实例。而实例方法就是属于一个类的实例的方法。类方法在定义的时候前面用“+”号标识,实例方法前面则用“-”号标识。比如:

  1. + (id)allObjective-C;//这是一个类方法  
  2.  (void)doSomething;//这是一个实例方法  

在调用的时候使用中括号的语法,比如:

  1. MyClass *class = [MyClass allObjective-C];//调用类方法,分配内存  
  2. [class doSomething];//调用实例方法,实现某些功能  

首先看一个完整的类的定义和实现的例子。
 
.h文件的代码为:

  1.  @interface Person:NSObject{  
  2. NSUInteger age;  
  3. NSString *name;  
  4. }  
  5. @property (nonatomic, assign)NSUInteger age;  
  6. @property (nonatomic,retain)NSString *name;  
  7.  
  8. + (Person *)person;  
  9. - (id)init;  
  10. - (void)setAge:(NSUInteger)theAge;  
  11. - (NSUInteger)age;  
  12.  
  13. - (void)vote;  
  14. @end  

.m文件的代码:

  1.  #import "Person.h"  
  2. @interface Person ()  
  3. - (BOOL)canVote;  
  4. @end  
  5. @implementation Person  
  6. @synthesize name;  
  7. - (void)setAge:(NSUInteger)theAge{  
  8. age = theAge;  
  9. }  
  10. - (NSUInteger)age{  
  11. return age;  
  12. }  
  13. - (id)init{  
  14. if (self = [super init]){  
  15. age = 0;  
  16. name = @"";  
  17. }  
  18. return self;  
  19. }  
  20. - (BOOL)canVote{  
  21. return age >= 18;  
  22. }  
  23. - (void)vote{  
  24. //do something  
  25. }  
  26. @end  

上面是一个比较完整的定义类的例子,首先在头文件里面定义了两个字段,叫age和name;还有两个属性,也叫age和name,还有一个初始化的方法和一个实例方法。很多朋友刚接触Objective-C的时候可能不理解,怎么字段和属性的名字是一样的?有什么不同么?是的,在Objective-C里面字段和属性的名字是可以一样的,但二者是不同的东西。一般来说一个类的头文件声明的结构是这样的:

  1.  @interface 类名{  
  2. 字段声明  
  3. }  
  4. 属性声明  
  5. 方法声明  
  6. @end  

字段是私有的,在类外部不能使用。必须使用属性,外部才能使用。什么是属性?其实属性就是对一个字段的get和set方法。在C#里面我们可以很方便地使用get和set访问器,但是在Objective-C里面要分别定义。比如上面的例子就是定义了一个setAge的set方法和一个叫age的get方法 。
 
 而如果我们并不需要在属性的get或者set方法中做任何的操作,还要自己写这么多代码实在是有些麻烦。Objective-C里有一种快速定义属性的方法,就是使用 synthesize。synthesize后面跟着属性名,编译器就会自动帮你添加一个属性,而不用自己去写get和set方法了。那如果你要定义的属性是只读的或者有其他特性,该怎么办呢?看头文件里面定义属性的时候,只要做一些说明就好了。
 
 比如上面例子中的name属性,在前面就有(nonatomic,retain)相关的说明。这些说明是跟内存管理和访问权限有关的,比如添加了retain说明,就类似于name = [value retail],也就是说在给这个属性赋值的时候就会把retain count增加一。还有其他的说明比如readonly等,不一一列举。一般来说,给基本类型比如NSInteger的属性添加的说明有nonatomic, assign,而给引用类型的属性添加唉的有nonatomic,retain。

除了定义字段和属性外,我们还需要定义方法。定义方法比较简单,只要区分好类方法和实例方法就好了。还有一点需要注意的是,在Objective-C中一个方法的名称是包含冒号的,比如age属性的set方法的完整的名称是setAge:,而不是setAge。Objective-C里方法的定义比较诡异,它允许将一个方法的名称和参数的名称混合在一起。比如在C#中我定义一个方法:     

  1. void SetPosition(int x,int y)  
  2. {}   
  3.    在Objective-C中就会变成这样:  
  4.  - (void)setPositionX:(NSInteger) x Y:(NSInteger)y{  
  5. }  

这个时候完整的方法名是“setPositionX:Y:”,方法名和参数名是混合在一起的,各参数之间用空格分开,参数名后面紧跟着冒号,并用小括号扩起参数的类型(别忘了引用类型要添加*以表示指针),最后跟着形参的名字。

还有一点要注意的是,形参的名字不要和属性或字段的名字重复了,否则会有编译警告,说局部变量覆盖了全局的变量。刚接触Objective-C的时候对这个可能会比较不习惯,不过到后来感觉还蛮舒服的。
  
.m文件里面的代码是方法的具体实现,这是对外不可见的。一个典型的m文件的内容为:
  
#import "头文件.h"//系统自带的请用<>而不是双引号,不解释

  1. @implementation 类名{  
  2. //方法的具体实现  
  3. }  

方法的实现就不需要过多的解释了。在上面的例子当中还额外多了一些东西

  1. @interface Person ()   
  2.      - (BOOL)canVote;   
  3. @end  

这又是干什么的了?在Objective-C中这叫“扩展”。所谓的扩展,其实就是对一个类的方法或属性进行扩展。原来的类中没有的方法或属性,我们可以很方便得进行扩展。但是一定要注意,在扩展中只能扩展属性和方法,如果你想添加字段,那就会编译错误。一个典型的扩展的写法跟interface比较类戏,形如:

  1. @interfae 类名(可以添加一些说明性的文字,也可以留空)  
  2. //定义属性和方法,但是不能添加字段,因此那一对大括号不能有  
  3. @end  

扩展可以是公开的,也可以是私有的,就看你在哪里定义。这里我定义在m文件里面,自然就是私有的了,如果定义在头文件里面,那么就是公有的。

interface可以分开多出定义,同样的implementation一个类也可以写多次,写多次的好处就是调理比较清晰,提高代码的可读性。比如可以把功能相关的一些代码写在一个

  1. @ implementation@end中 

然后另外一些代码写在别的地方。

Objective-C中定义一个类的最基础的语法大概就是这么多。

小结:Objective-C最基础语法之Class定义的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-07-06 11:19:45

Objective-C

2011-08-17 11:15:22

Objective-C语法

2010-11-04 16:32:00

Objective-C

2011-05-11 13:54:08

Objective-C

2011-08-02 13:16:36

Objective-C 语法 函数

2014-04-30 10:16:04

Objective-CiOS语法

2015-10-08 10:01:10

Objective-CLayout

2011-07-18 16:36:51

Objective-C XCode

2011-08-04 14:58:37

Objective-C Cocoa NSString

2011-05-11 15:45:50

内存管理Objective-C

2011-07-06 14:12:14

Objective-C

2011-04-08 10:51:17

Objective-CiOS

2011-08-18 15:19:28

XcodeObjective-C语法

2011-08-01 17:11:43

Objective-C 函数

2015-11-02 10:13:41

iOSObjective-C语法

2013-05-02 10:51:17

iOS开发Objective-C@property

2013-07-24 19:19:03

Objective-CiOS开发动态特性之protoc

2011-08-03 16:22:05

Objective-C CodeBlocks

2011-08-10 18:07:29

Objective-C反射

2011-07-29 15:47:21

iPhone开发 Objective- C
点赞
收藏

51CTO技术栈公众号