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

OC中类的定义

时间:01-03来源:作者:点击数:

在这一节,我们来学习一下OC中的类的如何定义的。

在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://www.cdsy.xyz");
}

-(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://www.cdsy.xyz");输出http://www.cdsy.xyz这个字符串
由于方法返回值是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、对于有返回值类型的方法注意在返回结束时要返回合适的数值。
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门