最简单的类
首先,创建一个工程,命名为Test,并将下面的代码编写到main.m中:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString * name;
-(void)display;
@end
//以上是类的声明部分
@implementation Person
-(void)display{
NSLog(@"%@",self.name);
}
@end
//以上是类的实现部分
int main(int argc, const char * argv[]) {
Person * person=[[Person alloc] init];
person.name=@"ZhangSan";
[person display];
return 0;
}
运行结果:ZhangSan
在使用C语言或者OC语言中的基本数据类型时,需要遵循“先声明,后使用”的原则。学习OC的类时,同样也需要遵循一个原则:“先声明,再实现,后使用”。
代码讲解
2-5行代码-类的声明部分
第2、5行代码:@interface是声明类的一个关键字,Person是声明类的类名,“:”可以理解成分隔符,后边紧跟的NSObject是这个类的父类。@end是类声明结束的标志。在这个结构中,我们可以添加类的属性和方法。(我们在OC中声明类的时候,必须指明父类(即使创建基类,也需要继承NSObject这个类)。
第3行代码:是向这个类中添加了一个字符串类型的name属性(声明属性的时候,不能给属性赋初值):@property是类中声明属性的关键字;在OC中,字符串类型用NSString类型的对象声明)(后面会具体讲NSString)。
第4行代码:是向这个类中添加一个返回值类型为空的方法。(方法的讲解会在类的具体分析中介绍)
7-11行代码-类的实现部分
第7、11行代码:是一个组合结构,这个结构是给声明好的类做实现用的。类声明和类实现的关系,就如同函数的声明和实现,光有声明,没有实现,那么声明的类或者函数就什么功能也没有,是没有意义的。
OC中对方法的实现要写在上面这个结构中(在类的声明部分,只能声明属性和方法,不能对属性进行赋初值,也不能对方法做实现,这是类的实现部分的工作,OC将这两个工作分开进行)。
8-11行代码:给类中定义的display方法做的实现代码。实现的功能是输出类对象的name属性的值
(NSLog()相当于C语言中的printf函数,@""相当于printf函数中的“”,%@是OC字符串类型的占位符,作用相当于C语言中输出语句中的%d,%s。通过self.name可以获取当前对象name属性的值)。
学到这,类就讲完了,大家可能会有许多疑惑:
1、self是什么,self.name是什么,为什么通过self.name就可以获得类对象的name属性的值?
2、为什么声明方法的前面一定要有一个“-”符号,看着怎么这么别扭?
……
等等这些问题,在本章的后面几节会讲到。
13-18行代码-Person类的具体使用
14行代码:Person * person:是声明一个Person类的对象,但是光声明不行,OC中的对象需要我们编写代码给它们分配内存空间。[Person alloc]中:alloc是一个方法,它是从NSObject这个父类中继承过来的,它能为我们自动对person对象分配内存(分配多少有OC语言的底层管理,你不需要知道),init同样是一个方法,也是继承父类的,它的功能是为person对象中的属性赋初值(表示数值的属性默认为0,字符串的属性默认没有值(用null表示)。
14行的代码可以替换成:(对于初始化对象的代码也可以这样写:
Person * person=[Person alloc];(分配内存空间)
person =[person init](对person这个对象进行初始化);
15行代码:对person对象的name属性进行赋值。对于字符串来说,同样要使用@“”符号。
16行代码:调用person对象的display方法;使用类创建的对象调用类中方法,采取的方式用[]扩起来,具体[]中的内容,在类的具体分析部分介绍。
(对类的使用做出的总结:在使用类时(不管是我们自己创建的,还是OC语言自带的):如果需要调用对象的属性,采用:类对象.属性的方式如果需要调用类中的方法:对于方法开头有”-“的,用[对象 方法]的方法。在后面的学习中,我们还会遇到带有”+“的,用[类名 方法]的方式调用)
通过对最简单的类程序进行分析,我们可以在main.m文件初步的创建一个简单的类。这种建立类的方式是不对的。
OC类的正确建立
类的声明部分写在一个.h文件中,类的实现部分写在.m文件(不是main.m)中。类的使用在main.m文件中。(创建文件的方法参照“OC工程添加文件”章节)。
我们按照正确的做法将本节中的例子做一下拆分:
建立一个Person.h文件,编写以下代码:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString * name;
-(void)display;
@end
建立一个Person.m文件,编写以下代码:
#import "Person.h"
@implementation Person
-(void)display{
NSLog(@"%@",self.name);
}
@end
在main.m 文件中:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
Person * person=[Person alloc];
person =[person init];
person.name=@"ZhangSan";
[person display];
return 0;
}
运行结果是:ZhangSan
注意:类的正确建立相比于前种方法,在类的实现部分和main.m文件中的使用部分都添加了类的.h头文件。
使用这种方式建立类的好处是:(必须使用正确方式建立类)