您当前的位置:首页 > 计算机 > 编程开发 > Objective-C

OC中类结构的详细介绍

时间:05-12来源:作者:点击数:

“类”的用途

创建类首先是用来解决问题的,通过调用类中的属性或者方法解决特定的问题。所以创建类的时候要注意了,必须要留有能够让外界调用的属性或方法。我们把类中能够让外界调用的属性和方法所在的文件称为“接口文件”。(这里的“外界”指的类的外部,通过创建这个类的对象或者类名来调用类中的资源)

OC中对类的声明和实现通常是在不同文件中写的:类的声明部分写在.h文件中,对类的实现写在.m文件中。h文件中的属性和方法,外界可以访问,而在.m文件声明的属性或方法外界无法访问。(所以,在OC中通常将.h文件称作类的接口文件)

搭建类框架的方法

之前我们已经学会通过创建.h和.m文件的方法正确的建立一个类。而在实际开发中,如果还使用这种方式,就太low了。

通过使用Xcode,给我们提供了建立一个类框架的快捷方式-Cocoa Class,通过选择它,输入类名和父类,Xcode就直接为我们初步创建了一个类框架,方便了程序员的开发。

类中只包含属性和方法,在OC中,还有很多和类相关的结构供我们使用。

类框架中可以添加的成份

类的接口部分(.h文件中的代码):

#import <Foundation/Foundation.h>
//引入头文件
@interface Person : NSObject{
//声明成员变量
}
//声明属性和方法
@end

类的实现部分(.m文件中的代码):

#import "Person.h"
//引入头文件
//添加类扩展
@implementation Person
//对声明的方法进行实现
@end 

引入头文件:

头文件有两种,OC中本来就有的头文件和自己创建的文件。引入编程语言提供的头文件的写法是:
         #import <文件名>

引入自己写的文件的写法是:
         #import "文件名"

引入的文件必须是.h文件,引入.m文件会报错。

类在.h文件和.m文件中都可以引入头文件,区别是:在.h文件中引入头文件,.h和.m文件都可以使用这个文件中的资源;如果在.m文件引入头文件,.h文件不能使用该文件中的资源。

所以,在引入头文件的时候,需要考虑在.h文件中当声明类的时候,是否使用该头文件中包含的资源。如果使用,就在.h文件中引入;反之,在.m文件中引入即可。

声明成员变量:

在类中,对于属性实际上有两种形式:成员变量和属性。它们都是变量。不同的是:成员变量外界不能调用,属性可以。成员变量一般用来在类中方法和方法之间传递数据。它的语法和C语言相同,例如:
         int i;(在类声明部分,所有的变量是不能赋初值的,这是规定)

声明属性和方法

声明属性:

在OC中,声明属性需要关键字来修饰:@property。例如,我们声明一个int型的age属性的编写方式为:
         @property int age;

声明方法;

在OC语言中,类中可以包含两种方法:类方法和对象方法。

首先,我们拿一个例子来直观地感受一下两种方法的不同:例如:我们现在需要创建一个返回值类型为int型的方法,它有两个参数,第一个是float类型,另一个是字符串类型(OC中字符串类型用NSString,以后会讲)

类方法的创建:
         +(int)personWithA1:(float)a1 andA2:(NSString*)a2; //a1,a2分别代表两个参数

对象方法的创建:
         -(int)personWithA1:(float)a1 andA2:(NSString*)a2;

通过比较,我们会发现,区别仅仅是在前面的符号,一个是“+”号,一个是“-”号。

“+”“-”号的不同是区分它们的一个标志,两种创建类方法不同之处的重点是调用对象的不同://调用类方法 [Person personWithA1:2 andA2:@"类方法"];//调用对象是类名

//调用对象方法
         Person * obj1=[[Person alloc]init];
         [obj1 personWithA1:1 andA2:@"对象方法"];//调用对象是类对象
         return 0;

所以,我们可以得出这样的结论:类方法要用类名调用;对象方法需要实例化对象调用。

在类中创建方法的步骤:

  1. 首先要确定你要创建类方法还是对象方法,类方法,类方法用+开头,对象方法用-开头。(拿类方法举例)
  2. 确定返回值类型(例如返回int类型)
  3. 确定这个方法有没有参数,如果有,我们就要在每个参数前,对这个参数进行说明(参数和后边参数说明之间至少有一个空格);如果没有,直接给这个方法起一个名字就可以了。

例如:+(int)personWithName:(NSString*)name andAge:(int)age andSex:(BOOL)sex;

我们知道,类的实例化对象是要占用一定空间的,所以在某种特定情况下,我们如果只需要使用类中的这个方法,而不需要调用类中其他的成员,那么这个方法就选用类方法的方式创建。

类扩展

在类的.m文件中,我们看到可以向类中添加类扩展。下面我们就来学一下什么是类扩展。

类扩展,就是给这个类添加私有属性或方法用的。在类扩展中声明的属性和方法外界是看不到的(这些属性或者方法只是在本类中使用)。下面我们来看一下类扩展的编写语法;

@interface Person (){//这行是说给Person类添加一个类扩展。
//向类声明部分一样,可以添加成员变量
}
//添加属性,语法和在类声明中的属性一样。
//添加方法
@end//这是类扩展的结束语句

方法的实现

这里是对类声明部分或类扩展中声明的方法进行实现,也就是对方法具体功能的编写。对于类声明中的方法和类扩展中的方法,举例说明:

//对类声明中的类方法做实现
+(int)personWithA1:(float)a1 andA2:(NSString*)a2{
    NSLog(@"%f,%@",a1,a2);
    return 0;
}

//对类声明中的对象方法做实现
-(int)personWithA1:(float)a1 andA2:(NSString*)a2{
    NSLog(@"%f,%@",a1,a2);
    return 0;
}

//对类扩展中的对象方法做实现
-(void)display{
    NSLog(@"类扩展中声明的方法");
}

通过对类结构的详细分析,相信大家对类又有了更进一步的认识。为了验证大家学习的效果,我们可以独立试着把以上这些程序段组合成一个完整的类。

注意: 如果有学习过Java或者C++的读者在学习OC的时候可能会问OC的类中有没有public、private、protected这个关键字修饰属性或方法呢?

在OC的类的定义中,同样有这几个关键字,并且苹果为他们每一个都配了一个“@”标示符(如@public)。在OC的类声明中,成员变量默认是受保护的,成员属性和方法不能用这几个关键字修饰。如果想变成私有,办法就是将属性或方法转移到类扩展中去。

 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门