OC中类的定义
在这一节,我们来学习一下OC中的类的如何定义的。
在OC中,供外界可以访问的属性或方法我们给他们起了一个名字:接口。这些属性和方法是同外界交流的通道,通过它们才能访问这个类。
OC中对类的声明和实现是在不同文件中写的,通常类的接口部分写在.h文件中,对类的实现写在.m文件中,.h文件中的属性和方法(接口),可以让外界访问,而在.m文件声明的属性或方法则无法供外界访问,只能在自己类中使用。
当然,你也可以将类的声明和实现都写在.m文件中(.h文件只能声明,不能做实现),但是在开发过程中很少这样干,因为一个工程可能很大,这样在访问这个类时,寻找接口就比较麻烦,还要去.m中去找,而且如果.m文件中的类过多时更麻烦。
如果采用第一种方法的话,就不会出现这种情况,在访问一个类时,我就可以直接通过文件名(通常文件名和类名一致,便于查找),找到这个类的.h文件,快速的就能找到我要的接口。
所以为了开发方便,我们一般选择第一种(.h/.m的方式)来创建类。我们通过OC基础的学习,会发现Xcode中已经给我们设计好了声明类的快捷方式:
通过选择它,输入类名和父类,Xcode就直接为我们初步创建了一个类框架,方便了程序员的开发。
类的接口部分(.h文件中的代码):
在OC里面,类接口的声明部分以@interface开头以@end结尾,“@”符号是为了和C语言进行区分(由于OC的底层是C,所以苹果官方开发OC的时候,为了和C中的关键字进行区分,想到了添加一个“@”,只要是和C语言有重复,就添加一个“@”)。
OC中的命名规则(一般是这样,如果公司有自己的要求,则按照公司要求来):
1、类名每个单词首字母大写;
2、类中属性名第一个单词首字母小写,后边每个单词首字母大写;
3、类中方法名第一个单词首字母小写,后边每个单词首字母大写,参数命名规则和属性相同。
同时还要注意的是,类名不能和属性名或者方法名相同。
下面我们来分解一下这段程序:
在这个例子中,我们声明了一个Person类,它继承自NSObject这个类。NSObject类是所有类的基类,由于OC中采用单继承(和Java语言类似,必须有且只能有一个父类)的方式,使得在OC中对类一层层的父类上找,总能找到NSObject,不客气的说,NSObject是所有类的祖先。
@property (nonatomic,copy)NSString * name;
@property告诉编译器要声明一个属性,(nonatomic,copy)是这个变量方法所做了一些设置,这些设置参数会放在一整节去讲。可以删掉不写(@property NSString * name也是对的),这里我向说明的就是我们还可以对属性进行设置。
这里你需要整明白的就是@property这个关键字的作用,后边的(nonatomic,copy)NSString * name的意思是声明一个字符串属性name,就相当于C语言中的char *。
-(void)display;
-(BOOL)isTrue;
上边两行表示这个类有两个行为(方法),这两个方法的返回值是不一样的,一个返回的是Void,代表空,就是什么也不返回。另一个返回的是BOOL,表示这个方法执行完毕后会返回给我们一个BOOL类型的值,BOOL就相当于C语言中的bool类型,他只有两个值,对(YES或1或true表示)和错(NO或0或false表示)
@end:表示告诉编译器这个类我创建完成了。
类的实现部分(.m文件中):
#import "Person.h"
@interface Person ()
@property (nonatomic,assign)int age;
@end
@implementation Person
-(void)display{
NSLog(@"http://c.biancheng.net");
}
-(BOOL)istrue{
return YES;
}
@end
代码解析:
#import "Person.h" :首先引入类的头文件,由于是对类的声明,所以首先你要让编译器知道你的类在哪,类中有哪些成员。编译器知道后,才能对.m文件中的代码进行分析,判断哪些代码是对类接口的实现;哪些代码是隐藏代码,只能在类中使用,外界无法使用。
@interface Person ():叫做:类扩展。这句代码和类声明代码类似,但是作用是不一样的。这段代码告诉编译器我要对Person这个类进行一下扩展,也就是在Person类中在添加一些属性或方法。
@property (nonatomic,assign)int age;
这句声明了一个整数类型的age属性,由于类扩展中的声明且代码写在了.m文件中,外界就无法访问这个age属性,所以这个age属性只能在本类中使用。
@end:告诉编译器我的类扩展写完了。
下边这些代码是对.h文件中声明的方法的实现:
-(void)display{
NSLog(@"http://c.biancheng.net");输出http://c.biancheng.net这个字符串
由于方法返回值是void,是空,所以不用返回东西,和C语言中的函数返回是一个道理
}
-(BOOL)istrue{
return YES;由于方法有返回值,所以用return返回一个BOOL类型的值,这里可以写YES\1\true都行;反过来写NO\0\false。
}
@end:最后一个告诉编译器我的类实现部分结束了。
main.m文件:
#import <Foundation/Foundation.h>
#import "Person.h"
int main() {
Person * people=[[Person alloc] init];
people.name=@"ZhangSan";
[people display];
int i=[people istrue];
NSLog(@"The people's name is %@,and i equal :%d",people.name,i);
return 0;
}
代码分解:
#import <Foundation/Foundation.h>
#import "Person.h" :在使用类之前,实现要将类的接口文件引入,告诉编译器,我在Person.h 文件中创建了一个类,后边才能使用。
Person * people=[[Person alloc] init]; 声明一个Person类的对象people,并对people这个对象进行分配空间并对对象的属性附初值(对people对象进行初始化)。
这个过程类的实例化,简单理解就是这个Person类赋予了一个真实存在的人,这个人名叫ZhangSan,并且ZhangSan还有两个行为,一个输出,一个判断。
people.name=@"ZhangSan"; 将ZhangSan这个字符串赋给这个对象的name属性
[people display]; 调用people自己的display方法(严谨的说,应该是向people这个对象发送display消息),由于该方法没有返回值,所以不用任何类型去接
int i=[people istrue]; 调用people的istrue方法,由于该方法返回的BOOL类型的值,所以可以用BOOL的变量去接,也可以用int型的变量去接
NSLog(@"The people's name is %@,and i equal :%d",people.name,i);
输出name属性的值和i的值
以上是对类中定义和结构的讲解,在这一节中我们初学者只需要掌握一起几点就可以了:
1、在OC中,什么是接口
2、为什么OC编程时要将类的接口和实现部分写在不同的文件中,写在同一文件中有什么弊端。
3、OC语言的命名规则
4、OC中怎么声明一个类
5、在类中怎么声明属性和方法。
6、怎么对创建好的类添加隐藏属性和方法。
7、实现类中方法的编码规则。
8、对于实际开发过程中,用Xcode如何快速创建一个类框架。
9、对于有返回值类型的方法注意在返回结束时要返回合适的数值。
在OC中,供外界可以访问的属性或方法我们给他们起了一个名字:接口。这些属性和方法是同外界交流的通道,通过它们才能访问这个类。
OC中对类的声明和实现是在不同文件中写的,通常类的接口部分写在.h文件中,对类的实现写在.m文件中,.h文件中的属性和方法(接口),可以让外界访问,而在.m文件声明的属性或方法则无法供外界访问,只能在自己类中使用。
当然,你也可以将类的声明和实现都写在.m文件中(.h文件只能声明,不能做实现),但是在开发过程中很少这样干,因为一个工程可能很大,这样在访问这个类时,寻找接口就比较麻烦,还要去.m中去找,而且如果.m文件中的类过多时更麻烦。
如果采用第一种方法的话,就不会出现这种情况,在访问一个类时,我就可以直接通过文件名(通常文件名和类名一致,便于查找),找到这个类的.h文件,快速的就能找到我要的接口。
所以为了开发方便,我们一般选择第一种(.h/.m的方式)来创建类。我们通过OC基础的学习,会发现Xcode中已经给我们设计好了声明类的快捷方式:
通过选择它,输入类名和父类,Xcode就直接为我们初步创建了一个类框架,方便了程序员的开发。
类的接口部分(.h文件中的代码):
#import <Foundation/Foundation.h> @interface Person : NSObject //属性的声明 @property (nonatomic,copy)NSString * name; //方法的声明 -(void)display; -(BOOL)isTrue; @end代码解释:
在OC里面,类接口的声明部分以@interface开头以@end结尾,“@”符号是为了和C语言进行区分(由于OC的底层是C,所以苹果官方开发OC的时候,为了和C中的关键字进行区分,想到了添加一个“@”,只要是和C语言有重复,就添加一个“@”)。
OC中的命名规则(一般是这样,如果公司有自己的要求,则按照公司要求来):
1、类名每个单词首字母大写;
2、类中属性名第一个单词首字母小写,后边每个单词首字母大写;
3、类中方法名第一个单词首字母小写,后边每个单词首字母大写,参数命名规则和属性相同。
同时还要注意的是,类名不能和属性名或者方法名相同。
下面我们来分解一下这段程序:
@interface 类名 : 父类名@interface是告诉编译器我要声明一个类,后面紧接一个类名,注意后边带有一个冒号,告诉编译器声明的这个类继承自冒号后边的那个类。
在这个例子中,我们声明了一个Person类,它继承自NSObject这个类。NSObject类是所有类的基类,由于OC中采用单继承(和Java语言类似,必须有且只能有一个父类)的方式,使得在OC中对类一层层的父类上找,总能找到NSObject,不客气的说,NSObject是所有类的祖先。
@property (nonatomic,copy)NSString * name;
@property告诉编译器要声明一个属性,(nonatomic,copy)是这个变量方法所做了一些设置,这些设置参数会放在一整节去讲。可以删掉不写(@property NSString * name也是对的),这里我向说明的就是我们还可以对属性进行设置。
这里你需要整明白的就是@property这个关键字的作用,后边的(nonatomic,copy)NSString * name的意思是声明一个字符串属性name,就相当于C语言中的char *。
-(void)display;
-(BOOL)isTrue;
上边两行表示这个类有两个行为(方法),这两个方法的返回值是不一样的,一个返回的是Void,代表空,就是什么也不返回。另一个返回的是BOOL,表示这个方法执行完毕后会返回给我们一个BOOL类型的值,BOOL就相当于C语言中的bool类型,他只有两个值,对(YES或1或true表示)和错(NO或0或false表示)
@end:表示告诉编译器这个类我创建完成了。
类的实现部分(.m文件中):
#import "Person.h"
@interface Person ()
@property (nonatomic,assign)int age;
@end
@implementation Person
-(void)display{
NSLog(@"http://c.biancheng.net");
}
-(BOOL)istrue{
return YES;
}
@end
代码解析:
#import "Person.h" :首先引入类的头文件,由于是对类的声明,所以首先你要让编译器知道你的类在哪,类中有哪些成员。编译器知道后,才能对.m文件中的代码进行分析,判断哪些代码是对类接口的实现;哪些代码是隐藏代码,只能在类中使用,外界无法使用。
@interface Person ():叫做:类扩展。这句代码和类声明代码类似,但是作用是不一样的。这段代码告诉编译器我要对Person这个类进行一下扩展,也就是在Person类中在添加一些属性或方法。
@property (nonatomic,assign)int age;
这句声明了一个整数类型的age属性,由于类扩展中的声明且代码写在了.m文件中,外界就无法访问这个age属性,所以这个age属性只能在本类中使用。
@end:告诉编译器我的类扩展写完了。
下边这些代码是对.h文件中声明的方法的实现:
-(void)display{
NSLog(@"http://c.biancheng.net");输出http://c.biancheng.net这个字符串
由于方法返回值是void,是空,所以不用返回东西,和C语言中的函数返回是一个道理
}
-(BOOL)istrue{
return YES;由于方法有返回值,所以用return返回一个BOOL类型的值,这里可以写YES\1\true都行;反过来写NO\0\false。
}
@end:最后一个告诉编译器我的类实现部分结束了。
main.m文件:
#import <Foundation/Foundation.h>
#import "Person.h"
int main() {
Person * people=[[Person alloc] init];
people.name=@"ZhangSan";
[people display];
int i=[people istrue];
NSLog(@"The people's name is %@,and i equal :%d",people.name,i);
return 0;
}
代码分解:
#import <Foundation/Foundation.h>
#import "Person.h" :在使用类之前,实现要将类的接口文件引入,告诉编译器,我在Person.h 文件中创建了一个类,后边才能使用。
Person * people=[[Person alloc] init]; 声明一个Person类的对象people,并对people这个对象进行分配空间并对对象的属性附初值(对people对象进行初始化)。
这个过程类的实例化,简单理解就是这个Person类赋予了一个真实存在的人,这个人名叫ZhangSan,并且ZhangSan还有两个行为,一个输出,一个判断。
people.name=@"ZhangSan"; 将ZhangSan这个字符串赋给这个对象的name属性
[people display]; 调用people自己的display方法(严谨的说,应该是向people这个对象发送display消息),由于该方法没有返回值,所以不用任何类型去接
int i=[people istrue]; 调用people的istrue方法,由于该方法返回的BOOL类型的值,所以可以用BOOL的变量去接,也可以用int型的变量去接
NSLog(@"The people's name is %@,and i equal :%d",people.name,i);
输出name属性的值和i的值
以上是对类中定义和结构的讲解,在这一节中我们初学者只需要掌握一起几点就可以了:
1、在OC中,什么是接口
2、为什么OC编程时要将类的接口和实现部分写在不同的文件中,写在同一文件中有什么弊端。
3、OC语言的命名规则
4、OC中怎么声明一个类
5、在类中怎么声明属性和方法。
6、怎么对创建好的类添加隐藏属性和方法。
7、实现类中方法的编码规则。
8、对于实际开发过程中,用Xcode如何快速创建一个类框架。
9、对于有返回值类型的方法注意在返回结束时要返回合适的数值。