对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型
面向对象的编程语言都是有类及对象的
类是由属性及方法组成。
OC中的所有官方类及自定义的类都是NSObject的直接或者间接子类
下面看看类的编写规范
首先,COMMAND+N 新建一个类 Dog类
看到会生成两个文件.h和.m
.h是对属性及方法的声明,.m是对方法实现.
Dog.h文件中编写如下
?
#import@interface Dog : NSObject{ //名字的变量 类型是字符串 NSString *_name; //性别暂时用int值代替 1代表公 0代表母 int _sex; } // 前面是+号,即此函数是Dog类的方法 可以直接用Dog类名来调用 // 无需创建对象就可以调用,简化代码 //另一个作用就是用来创建单例,即在整个生命周期,无论创建多少次都是同一个对象 + (instancetype)sharedDog; // 前面是-号的叫做对象方法 //默认的无参构造函数 如果不写 也是会存在的默认构造函数 - (instancetype)init; //带一个参数的构造函数 - (instancetype)initWithName:(NSString *)name; //带两个参数的构造函数 - (instancetype)initWithName:(NSString *)name AndSex:(int)sex; //对象变量name、sex的get及set方法 - (void)setName:(NSString *)name; - (NSString *)name; - (void)setSex:(int)sex; - (int)sex; // 狗的一个行为 // bark(叫) 返回值为void空,无参 - (void)bark; //lookHome(看家)无参 - (void)lookHome; @end
Dog.m代码编写如下
?
?
#import Dog.h
@implementation Dog
// 由此可见,利用Dog类名来调用这个方法时 无论创建多少次对象都是同一个dog
+ (instancetype)sharedDog{
static Dog * dog;
if (dog != nil) {
dog = [[Dog alloc] init];
}
return dog;
}
//init开头的方法都是初始化构造函数 一种编码规范
// init是没有参数的默认写法
- (instancetype)init{
if (self = [super init]) {
}
return self;
}
//这是具有一个参数的初始化构造函数
- (instancetype)initWithName:(NSString *)name{
if (self = [super init]) {
_name = name;
}
return self;
}
//具有两个参数的构造函数
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex{
if (self = [super init]) {
_name = name;
_sex = sex;
}
return self;
}
- (void)setName:(NSString *)name{
_name = name;
}
- (void)setSex:(int)sex{
_sex = sex;
}
- (int)sex{
return _sex;
}
- (NSString *)name{
return _name;
}
//叫得方法 实现
- (void)bark{
//在类的方法中可以访问成员变量,也可以赋值
_name = @刀刀;
NSLog(@%@在叫!,_name);
}
- (void)lookHome{
_sex = 1;
NSLog(@刀刀狗是个%d的,_sex);
}
@end
main函数引入头文件后创建几个对象
?
?
#import#import Dog.h int main(int argc, const char * argv[]) { @autoreleasepool { Dog * dog1 = [Dog sharedDog]; [dog1 setName:@刀刀]; [dog1 setSex:1]; //%p可以打印出对象的地址 0x100106800 NSLog(@%p,dog1); Dog * dog2 = [Dog sharedDog]; //0x100106800 dog2的地址和dog1的地址一样 即是同一个对象 NSLog(@%p,dog2); //当我们在main函数即相对于Dog类来说的外界函数 我们无法调用self.name的 我们通过set/get来对变量进行赋值或者获取 // alloc 是在堆空间开辟一块空间 然后init初始化对象 Dog * dog3 = [[Dog alloc] init]; //下面赋值可以这样写 dog3.name = @汪星人; //原理就是此语句调用的下面这个方法 调用了 -(void)setName:(NSString *)name; [dog3 setName:@汪星人]; //下面dog3.name 的作用跟 [dog name]一样 //其实前者这样写的原理就是调用了后者 调用了(NSString *)name方法 NSString * name = dog3.name; NSLog(@%@,name); //dog3调用直接的bark(叫)的方法 [dog3 bark]; //有参的初始化方法 Dog * dog4 = [[Dog alloc] initWithName:@大黄 AndSex:8]; NSLog(@我是%@,dog4.name); } return 0; }
下面,来介绍一个知识点,即property属性修饰
?
改写一下Dog类
首先,Dog.h中 改写成下面这样
?
#import@interface Dog : NSObject{ } @property NSString * name; @property int sex; // 前面是+号,即此函数是Dog类的方法 可以直接用Dog类名来调用 // 无需创建对象就可以调用,简化代码 //另一个作用就是用来创建单例,即在整个生命周期,无论创建多少次都是同一个对象 + (instancetype)sharedDog; // 前面是-号的叫做对象方法 //默认的无参构造函数 如果不写 也是会存在的默认构造函数 - (instancetype)init; //带一个参数的构造函数 - (instancetype)initWithName:(NSString *)name; //带两个参数的构造函数 - (instancetype)initWithName:(NSString *)name AndSex: