OC中类结构的详细介绍
类”的用途
创建类首先是用来解决问题的,通过调用类中的属性或者方法解决特定的问题。所以创建类的时候要注意了,必须要留有能够让外界调用的属性或方法。我们把类中能够让外界调用的属性和方法所在的文件称为“接口文件”。
(这里的“外界”指的类的外部,通过创建这个类的对象或者类名来调用类中的资源)
OC中对类的声明和实现通常是在不同文件中写的:类的声明部分写在.h文件中,对类的实现写在.m文件中。h文件中的属性和方法,外界可以访问,而在.m文件声明的属性或方法外界无法访问。(所以,在OC中通常将.h文件称作类的接口文件)
搭建类框架的方法
之前我们已经学会通过创建.h和.m文件的方法正确的建立一个类。而在实际开发中,如果还使用这种方式,就太low了。
通过使用Xcode,给我们提供了建立一个类框架的快捷方式-Cocoa Class,通过选择它,输入类名和父类,Xcode就直接为我们初步创建了一个类框架,方便了程序员的开发。
类中只包含属性和方法,在OC中,还有很多和类相关的结构供我们使用。
类框架中可以添加的成份
类的接口部分(.h文件中的代码):
类的实现部分(.m文件中的代码):
引入头文件:
头文件有两种,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;
所以,我们可以得出这样的结论:类方法要用类名调用;对象方法需要实例化对象调用。
在类中创建方法的步骤:
我们知道,类的实例化对象是要占用一定空间的,所以在某种特定情况下,我们如果只需要使用类中的这个方法,而不需要调用类中其他的成员,那么这个方法就选用类方法的方式创建。
类扩展
在类的.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的类声明中,成员变量默认是受保护的,成员属性和方法不能用这几个关键字修饰。如果想变成私有,办法就是将属性或方法转移到类扩展中去。
创建类首先是用来解决问题的,通过调用类中的属性或者方法解决特定的问题。所以创建类的时候要注意了,必须要留有能够让外界调用的属性或方法。我们把类中能够让外界调用的属性和方法所在的文件称为“接口文件”。
(这里的“外界”指的类的外部,通过创建这个类的对象或者类名来调用类中的资源)
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;
所以,我们可以得出这样的结论:类方法要用类名调用;对象方法需要实例化对象调用。
在类中创建方法的步骤:
- 首先要确定你要创建类方法还是对象方法,类方法,类方法用+开头,对象方法用-开头。(拿类方法举例)
- 确定返回值类型(例如返回int类型)
- 确定这个方法有没有参数,如果有,我们就要在每个参数前,对这个参数进行说明(参数和后边参数说明之间至少有一个空格);如果没有,直接给这个方法起一个名字就可以了。
我们知道,类的实例化对象是要占用一定空间的,所以在某种特定情况下,我们如果只需要使用类中的这个方法,而不需要调用类中其他的成员,那么这个方法就选用类方法的方式创建。
类扩展
在类的.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的类声明中,成员变量默认是受保护的,成员属性和方法不能用这几个关键字修饰。如果想变成私有,办法就是将属性或方法转移到类扩展中去。