1.接口部分:对外声明类的行为和特征(类的定义分为:接口部分和实现部分)
① @interface 接口关键字:用于表示这是一个类的接口部分
接口部分功能:是定义类的静态特征和声明动态行为
@end 作为结束标志
对外接口:通过接口就可以在不知道实现的情况下,了解这个类有什么
Person:类名,每一个类都要起一个名字。首字母大写(类:对象的类型)
NSObject:父类
@interface Person: NSObject
②静态特征:实例变量
③实例变量必须在花括号中
④创建实例变量的时候不能被赋值
⑤在创建实例变量的时候,实例变量钱加“_”:系统这样写;区分;
{
⑤实例变量的可见度
《1》内部:类的实现部分使用实例变量
《2》外部:不在实现部分使用
《3》@public范围:外部、内部、继承
《4》@protected(系统默认)范围:内部、继承
《5》@private范围:内部
//添加当前类属性
@public//作用范围是直到下一个结束或者实例变量结束
NSString *_name;
NSInteger _age;
@protected
CGFloat _height;
@private
CGFloat _weight;
}
//动态行为:方法(添加类的行为)
- (void)sayHi;
@end
2.实现部分:类行为的具体实现(方法的实现)
①@implementation:关键字,表示类的实现部分
Person:类名,表示实现的是哪个类
@end:类 结束实现标志
@implementation Person
- (void)sayHi{
NSLog(@“Hello World”);
}
@end
3.使用类创建对象。Objective-C中创建的对象,全部放在堆区(对象:类的实例)
int main(){
@autoreleasepool{
①申请空间
保存空间地址
《1》内存分配 (alloc方法:用于分配内存空间)
Person *p = [Person alloc];
《2》对象初始化(init方法:用于初始化对象),将内存空间数据清零
p = [p init];
《3》将创建对象的《1》和《2》合成一步
Person *p1 = [[Person alloc] init];
②使用成员变量
p1->_age = 10;
p1->_name = @“贝爷”;
③使用方法
[p1 sayHi];
}
return 0;
}
4.类是对一类具有相同事物行为和特征事物的抽象
5.封装、继承、多态
①封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内
②继承:子类自动共享父类数据结构和方法的机制,这是类之间的一种关系
③多态:指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果
6.@class的作用:只是表示有Girl这么一个类型,其他的什么都没做。在什么地方使用Girl这个类时,再导入Girl.h
注意:我们一般选择在.h中使用@class,在.m中引入头文件
7.组合类的使用:(指针存储对象的首地址,代指对象。OC中使用指针代指对象,进行操作)
①Mother.h
#import <Foundation/Foundation.h>@interface Mother : NSObject{ @public NSString *_name;}
@end
②Father.h
#import <Foundation/Foundation.h>@interface Father : NSObject{ @public NSString *_name;}
@end
③Child.h
#import <Foundation/Foundation.h>@interface Child : NSObject{ @public NSString *_name;}
@end
④Family.h
#import <Foundation/Foundation.h>
#class Father;
#class Mother;
#class Child;
@interface Family : NSObject{ @public Father *_f; Mother *_m; Child *_c;}
@end
⑤main.m
Father *father = [[Father alloc]init]; father->_name = @"父亲"; Mother *mother = [[Mother alloc] init]; mother->_name = @"母亲"; Child *child = [[Child alloc] init]; child->_name = @"孩子"; Family *family = [[Family alloc] init]; family->_f = father; family->_m = mother; family->_c = child;
NSLog(@"%@ %@ %@ ",family->_f->_name,family->_m->_name,family->_c->_name);
8.打印字符串用“%@”做占位符。用”[]”调用方法
有打印,没有控制台输入
9.
①面向过程:编程以事件(任务)为中心,程序围绕事件,列出了事件的每个步骤,一步一步完成(侧重点:实现功能 C)
②面向对象:编程以事物为中心,程序围绕事物展开,完成事件只是一个小任务(侧重点:对象的特征 OC,C++,java)
10.Objective-C中的几种方法
①“-”实例方法:由类的实例来执行。换言之,在调用实例方法之前,必须先创建该类的实例。实例方法是最常见的方法类型(方法只能对象使用)
示例:- (instancetype)init;
// 有参(1个参)无返回值// 冒号属于方法名的一部分// 方法名:printNum:- (void)printNum:(NSInteger)num;// 有两个参数// 方法名:printName:age:- (void)printName:(NSString *)name age:(NSInteger)age;//有三个参数//方法名:printName:age:score:
- (void)printName:(NSString *)name age:(NSInteger)age score:(CGFloat)score;
②“+”类方法:可由它所在的类直接执行。它不需要对象的实例作为消息的接收者(方法只能被类使用)
示例:+ (instancetype)alloc;
注:类方法中不能使用实例变量
11.instancetype和id区别
①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型对象。
②instancetype只能作为返回值和参数,id还可以用来定义变量
③instancetype会告诉编译器当前的类型,但id对编译器却是无类型的,调用任何方法不会给出错误提示
④对于init方法,id和instancetype是没有区别的。因为编译器会把id优化成instancetype。当明确返回的类型就是当前class时,使用instancetype能避免id带来的编译不出错误的情况。
12.如何获取方法名
①删除:类型标识,返回类型,参数类型,参数名,空格。
示例:replaceObjectAtIndex:withObject
注意:类中不能出现同名方法;“:”标识参数,不能省略。有冒号必须有参数;冒号属于方法名的一部分。
13.在OC中使用消息发送机制:[receiver message]
表述:①给receiver对象发送message消息②receiver接收到消息,即方法getSalary③receiver找到message方法,并执行
14.setter和getter方法
①在OC中,为单一实例变量赋值的方法称作setter(设置器)
②获取单一实例变量值得方法称作getter(访问器)
15.setter和getter方法的书写格式
给实例变量:NSInteger _age;
①setter的书写格式:- (void)setAge:(NSInteger)age;
即set+首字母大写的实例变量名(忽略下划线)
②getter的书写格式:- (NSInteger)age;
j即返回值类型与变量类型一致,方法名与实例变量名相同(忽略下划线)
16.setter和getter与实例变量的关系
①无论setter还是getter内部操作的是实例变量
②每一个实例变量都需要一对setter和getter方法
17.setter和getter的实际操作
①Person.h
#import <Foundation/Foundation.h>//类的接口部分/* 1.定义一个类 2.添加当前类属性(特征) 3.添加当前类行为(方法) */@interface Person : NSObject{ //大括号内部,添加当前类属性 //字符串类型 NSString *name;//姓名,NSString同样是一个类 //整型 NSInteger age;//年龄,NSInteger是数值类型,不是一种类 //字符串类型 NSString *gender;//性别}//初始化方法//希望通过初始化方法,能够获得一个Person类的实例对象,并且希望该对象具有自己的姓名属性- (id)initWithName:(NSString *)_name;//大括号外部,添加当前类行为- (void)sayHi;//设置器 setter- (void)setName:(NSString *)_name;- (void)setAge:(NSInteger)_age;- (void)setGender:(NSString *)_gender;//访问器 getter- (NSString *)getName;- (NSInteger)getAge;- (NSString *)getGender;
@end
②Person.m
#import "Person.h"@implementation Person- (id)initWithName:(NSString *)_name{ //1.原始初始化,也就是将内存内的变量置零 self = [super init];//将init方法发送给super对象 //2.原始初始化成功之后,需要设置当前对象的姓名为形参 if (self != nil) { name = _name; } //3.返回当前对象 return self;}//大括号外部,添加当前类行为- (void)sayHi{ //NSLog将字符串打印在控制台进行输出,类似于printf(); NSLog(@"hello world");}//设置器 setter- (void)setName:(NSString *)_name{ //设置给当前对象的属性 name = _name;}- (void)setAge:(NSInteger)_age{ age = _age;}- (void)setGender:(NSString *)_gender{ gender = _gender;}//访问器 getter- (NSString *)getName{ //访问当前对象的属性 return name;}- (NSInteger)getAge{ return age;}- (NSString *)getGender{ return gender;}
@end
③main.m
#import <Foundation/Foundation.h>#import "Person.h"//引入类名字
int main(int argc, const char * argv[]) {
//1.创建Person类的实例对象 Person *person = [[Person alloc] initWithName:@"Lewis"];//用【】调用方法 //2.给person发送实例消息sayHi [person sayHi]; //修改name,添加设置器(setter)与访问器(getter) /* 类名 属性名 设置器方法名 访问器方法名 Person name -setName: -getName */ //3.先打印当前person实例对象的姓名是什么 NSLog(@"person's name is %@",[person getName]); //4.修改当前person实例对象的姓名,修改成jack [person setName:@"Jack"]; NSLog(@"person's name is %@",[person getName]);
}
18.点语法(只对getter setter有效)
s.name = @"小白";
NSLog(@"%@",s.name);
[s setAge:12];
NSLog(@"%ld",[s age]);
s.score = 99.99;
NSLog(@"%.2f",s.score);