首页 > 代码库 > OC基础总结
OC基础总结
1.NSLog的使用:Foundation用于日志输出的函数
%@ 输出对象的占位符,当它输出的对象的时候会调用对象description方法
%C Unicode字符
%c ASCII码
2.面向对象思想
1、相对于面向过程
面向过程:强调的步骤,以动词打头的
面向对象:强调完成这个事情,所需的对象
2、面向对象的好处
1、这种思维方式更加接近现实生活
2、提高代码灵活性,和可扩展性
3、提高代码的可维护性
对象:
在软件设计阶段:对象就是现实生活中一个个事物
类的产出: 类就是提取对象共性
1、这些对象共有的状态特征-》属性
2、这些对象的行为特征-》 方法
3、确定类与类之间关系
编码角度:必须有类才能创建对象
类是汽车图纸
对象一个个的汽车实体
类的设计:
类就是提取对象共性
1、这些对象共有的状态特征-》属性
2、这些对象的行为特征 -》 方法
一个包含三个要素
1、类名:就是这一类事物的名称
2、属性:这些对象共有的状态特征
3、方法:这些对象的行为特征
一个软件的开发:
产品经理
需求分析:这个软件需要做什么,不需要做什么
软件设计:设计出来这个软件中包含哪些类
项目经理
分配任务,监督程序员,处理程序员开发中遇到问题
编码:编码
3.类的定义:
一类包含两个部分 @interface 与 @end 之间
类的声明
0、确定父类:在类名称后通过 : 来指定自己的父类
1、声明属性
2、声明方法
类的实现:实现声明中方法 @implementation@end 之间
3.1 定义的格式
3.2 属性(成员变量)
@interface与@end 之间 的 大括号中
3.2.1 成员变量权限控制修饰符
@private :私有的,只能在本类中访问
@protected受保护的(默认),只能在本类和子类中访问
@public :公共的,可以所有的类中访问
@package:框架中,在框架内部相应与@protected在框架外部,相当于@private(了解)
3.2.2 属性封装
封装属性的方法就是为每一个属性提供setter和getter方法
setter方法:
1、必须是对象方法
2、必须没有返回值
3、必须set +成员名称去掉_首字母大写
4、必须要一个参数,并且参数类与成员变量的类型一致
getter方法
1、必须是对象方法
2、返回值类必须与成员变量的类型一致
3、名称必须是成员变量的名称去掉_
4、必须是空参
3.2.3@property
@property 自动生成setter与getter方法的声明和实现,还会生成一个私有成员变量
格式:@property(是否是原子属性,权限) 属性类型 属性名称;
是否是原子属性
atomic:原子,默认,在setter方法会给属性加锁
nonatomic:非原子,不会在setter方法给属性加锁,它的访问速度快
权限
readwrite:可读可写(默认),生成getter和getter方法
readonly :只读,只生成getter方法
如何自定义setter方法
我们自己写一个setter方法,@property会帮我生成getter方法和私有成员变量
如何自定义getter方法
我们自己写一个getter方法,@property会帮我生成setter方法和私有成员变量
如果我们自定义了getter和setter方法,@property不会帮我们私有成员变量,需要自己写
3.2.4 点语法
点语法就是setter与getter方法调用的简写形式
如果.在等号的左边表示调用setter方法
如果.在等号的右边或没有等号表示调用getter方法
3.3 方法
3.3.1 对象方法
1、在声明和定义时候以-开头
2、对象方法是隶属于对象的,只能对象调用
3、对象方法中可以直接访问成员变量
4、对象方法中可以通过self来调用其他成员方法,也可以通过self使用点语法来访问属性
5、对象方法中可以调用类方法,但是调用类方法的时候需通过类名,不通过self调用
3.3.2 类方法
1、在声明和定义时候以+开头
2、 类方法是隶属于类的,只能类对象或类名称调用
3、 类方法中不可以直接访问成员变量
4、 类方法中不可以通过self来调用其他成员方法,可以通过形参和创建一个对象的方式,来访问这个对象的对象方法
5、 类方法中可以调用类方法
3.3.3 self关键字
1、self用在对象方法中,表示调用这个方法的那个实例对象
2、self如果在类方法中,表示类对象
3、无论self在什么样的方法中,谁调用这个方法,self就是谁
3.3.4 super
1、调用父类的方法
重写:在子类中实现父类中同名的方法
使用场景:1、如果我们重写父类,还想使用父类中该方法的功能这时候就使用supper来调用父类这个方法
2、在我们自定义init方法时候,首先要调用父类的init方法
3.3.5description方法
1、description对象方法:当我们通过NSLog输出一个实例对象的时候会调用对象上这个方法
2、description类方法,当我们通过NSLog输出一个类对象的时候会调用类对象上这个方法
3.3.6 初始化方法
1、NSObject默认实现一个init方法,什么都没有干,仅仅是把自己地址给返回了
2、什么时候需要重写父类init方法:当我们每次创建对象的时候,都给对象中属性提供同样的默认值的时候,就可以重写父类init方法
3、如何重写父类init方法
1、首先是对象方法
2、返回值类必须是instancetype或id类型
3、方法名称必须是init
4、方法内部必须先调用父类的初始化方法
5、判断父类是否初始化成功
6、如果父类初始化成功了才可以初始化自己的成员变量
7、必须返回指向字节的指针
4、如何自定义初始方法
0、必须提供方法声明和实现
1、首先是对象方法
2、返回值类必须是instancetype或id类型
3、方法名称必须是initWith开头
4、方法内部必须先调用父类的初始化方法
5、判断父类是否初始化成功
6、如果父类初始化成功了才可以初始化自己的成员变量
7、必须返回指向字节的指针
4.对象的创建
1、通过类new方法创建
1、给实例对象在堆中开辟存储空间
2、把所有成员变量初始化为0
3、返回指向该对象指针
2、通过 [[类名 alloc] init];
3、通过工厂方法(快捷的构造方法)
5.对象与函数\方法
1、对象只可作为方法或函数的形参
2、当对象在方法传递是地址传递
3、对象可以作为方法的返回值
4、对象可以作为方法或函数参数在其中进行连续的传递
5、方法或函数内部可以调用对象上的方法和访问对象上其有权限访问的属性
6.对象与对象之间的常见关系
6.1依赖关系:当A类的一个对象作为B的方法形参或局部变量的时候,B依赖与A
6.2关联关系: 就是hasA关系,B类中有一个成员变量是A类的实例对象,B拥有一个A,BhasA A;
7.面向对象的三大特征
7.1[抽象]:类是对象抽象,父类子类抽象
7.2 封装:
功能封装:就是把同一类功能封装到一个类中供外界访问
数据的封装:类可以一个事物的所有状态特征封装成属性
属性封装:给每一个属性提供getter和setter方法
当我们把东西都封装起来后,外界调用的时候,就无需关系你内部的做的,是用起来就比较方便
7.3 继承:A 类继承 B类,那么A类就拥有了B类中所有成员变量和方法
注意点:
1、子类中不可以有与类同名成员变量,哪怕这个成员变量在父类中私有的也不可以
2、OC单继承
3、OC多层继承
优点:代码复用
缺点:高耦合
OC中的基类是NSObject
7.4 多态:同一指针指向不同的对象的时候,表现出来不同的形态
1、必须有继承
2、子类必须重写父类方法
3、必须是父类指针指向子类对象
优点:简化代码
提高代码的灵活性
8.其他关键字
#include:C语言提供预编译指令,它把所包含的文件内容拷贝过来
#import:它功能与#include一样,但它可避免重复包含
在OC中只能#import导入头文件,不能导入实现文件
#import "" 导入自己写的头文件
#import <> 导入系统或框架中头文件
@class:作用防止循环导入
告诉编译器它后面这个东西是个类,它不知道这个类中有什么东西(属性,方法)
@class 都用在头文件中
nil:如果一个类中有成员变量是对象类型的,那么它在初始化的就被初始化为nil
在OC中可以给nil发送任何消息,都不会报错,当你给nil发送消息的时候,它什么都不做
在OC中通过nil来清空指针
9.Foundation中数据类型
BOOL:逻辑类型,只有真和假两个值
YES 为真
NO 为假
BOOL 可以定义变量
可以作为形参
可以作为返回值类型
NSObject * 对象类型
静态的数据类型:
优点:编译时的检查
代码提示准确
id:动态类型
优点: 在没有继承的时候,可以使用多态的特性
缺点:不会进行编译时的检查,如果你调用它所指向的对象上不存在的方法就再运行时报错
代码提示不准确
10. NSString类简介
1、创建
1、通过字面量方式
NSString *str1 = @"小黑"
2、通过初始化方法
// 把C语言的字符转换为OC字符串
NSString *str2= [[NSString alloc] initWithUTF8String:"C字符串"];
3、通过类方法
NSString*str3 [NSString stringWithFormat:@"格式化字符串",参数]
2、计算长度
[str length] :计算字符串中有几个字符
OC基础总结