OC 面向对象 和 面向过程

面向过程:使用步骤划分功能,然后用函数一步一步的调用

面向对象:OOP (Object Oriented Programming) 使用功能来简化问题,

面向对象语言 : C++、 Java、 C#

重点概念: 对象、类、封装、继承、多态等等

面向对象3大特征:封装、继承、多态。

封装的思想:”麻烦自己,方便别人”。

两种编程思想:面向对象设计具有良好的可扩展性、可重用性。

类和对象类:具有相同特征和行为的事物的抽象。

对象:对象就是类的实例,类的具体表现。生活中的万物都是对象。类和对象是面向对象的核心。对象是类的实例。类是对象的类型。面向对象编程中使用对象完成程序。

开发中:先定义类,再创建对象,然后使用对象。

OC中类的定义定义类包含两部分:接口部分和实现部分。

接口部分:对外声明类的特征和行为。(类似说明书)

实现部分:对内实现行为。(内部的具体实现)

接口部分标志:@interface...@end作用:声明类的实例变量和方法,即特征和行为。包含内容:类名、父类名、实例变量、方法等。

实现部分标志:@implementation...@end作用:实现方法,即实现类的行为。

类和文件类:@interface...@end @implementation…@end

文件:.h称为接口文件或头文件, .m称为实现文件。文件和类本质没有关系。创建对象类是模板,对象是具体表现,任何对象都要占用内存空间。

创建对象分两步:分配内存空间和初始化。

分配内存空间:根据类中声明的实例变量为对象分配内存,将所有实例变量置为默认值0,并返回首地址。

初始化:为对象的实例变量设置初始值,+(id)alloc;+表示这个方法属于类,只能类执行。id返回值类型,表示任意类型的对象,即创建好的对象。-(id)init;-表示这个方法属于对象,只能对象执行。

id返回值类型,表示初始化完成的对象。使用对象 指针存储对象的首地址,代指对象。OC中使用指针代指对象,进行操作。实例变量操作实例变量在初始化只做少量设置,后期还需要进行设置。

实例变量区分可见度,共三种。

默认的可见度是@protected

@public (公有) 实例变量可在类的外部和内部操作

@protected:(受保护) 实例变量只能在该类和其子类内操作

@private:(私有的) 实例变量只能在该类内访问public修饰的实例变量,可以直接使用“->”访问。

面向对象和面向过程是两种不同的编程思想,思考角度不同,前者以对象为中心,后者以事件为中心。类是对象的抽象,对象是类的体现。面向对象编程中,先创建出对应的类,再由类生成对象,进而完成我们的开发。

方法OC中的方法分两种:类方法(只能类使用) 和 实例方法(只能对象使用)

OC中方法采用消息发送机制:【receiver message】 给对象发送消息setter 、getter

OC中,为实例变量赋值的方法称为setter(设置器)。读取实例变量值的方法称为getter(访问器)。设置器用来为实例变量赋值,访问器用来取实例变量的值。

属性:@property (nonatomic,retain) NSString *name; @property (nonatomic,retain) NSString *gender; @property (nonatomic,assign) NSInteger age;相当于设置器与访问器,系统自动生成,直接调用即可,默认生成的实例变量可见度为私有。

(retain assign copy)为语义属性,声明对象时使用retain copy,声明基本数据类型时用assign。

自定义初始化方法- (id)init 这个方法只能给实例变量设置默认值,不灵活。- (id)initWithName:自定义初始化方法,根据需求定义初始化方法。

#import 导入头文件,#import””导入自定义类。#import<>导入;导入类库中的头文件,还可以根据路径去导入库中的文件。

@class 告诉编译器@class后的字符串作为类名使用,并未导入类的接口内容,有效避免嵌套循环导入。

继承继承的作用:既能保证类的完整,而且简化代码继承的特点:

1.一个子类只能有一个父类;

2.继承是单向的(只允许单继承);

3.一个父类可有多个子类;

4.继承具有传递性;

5.继承时会继承父类所有的特征和行为。

继承的内容:所有实例变量和方法。没有父类的类称为根类,OC中的根类是NSObject

.super 编译器指令,并非对象。作用是:给super发消息,可以执行父类中实现的方法。

初始化方法创建对象分两步:开辟空间、初始化。

初始化方法的主要作用是:为某些实例变量赋初值初始化方法在对象的整个生命周期里只使用一次。

完整的初始化方法:- (id)init { 做安全处理 // self = [super init]; //执行父类中实现的init方法 if(self){ //初始化设置 } return self; }

便利构造器 : 封装了对象创建过程Block的使用:Block允许嵌套定义,定义时最后加;

返回值可以省略。如:int(^sum)(int x, int y) = ^(int x, int y){ return x + y;};挡在Block内部使用外部定义的局部变量时,如果变量没有被Block修饰,则在Block内部不能对它进行修改。若想修改,变量必须要有__block修饰。__block告诉编译器编译时在Block内部不要把外部变量当做常量使用,还是当做变量使用。如果在Block中访问全局变量,就不需要block修饰。

NSString NSArray NSDictionary NSSet NSNumber NSDate类的扩展分类,类目,category为没有源代码的类添加方法(只添加方法,不添加实例变量)是扩展一个类的的功能的方式之一,为原有类扩展的方法会成为原类的一部分,使用即可。分类也分为.h(接口部分)以及.m(实现部分)。.h文件中填写声明的方法,.m文件中填写方法的实现。

 

协议协议相当于任务清单,规定所要做的操作,谁服从协议,谁就要实现清单中的方法,所以协议只有.h文件,没有.m文件。协议要让类服从,服从完协议之后,要实现协议的方法。

内存管理OC中采用引用计数机制管理内存。

内存管理的基本原则:如果你对一个对象进行alloc retain copy 之后,你就拥有了该对象的所有权,就必须对它进行release或者autorelease。

autorelease: 会将声明为autorelease的对象放到离他最近的自动释放池中,当自动释放池销毁时,会向池中的每一个对象发送一个release消息。

release:立即释放当一个类的的对象引用计数为0时,系统会自动调用该类的dealloc方法来回收空间,该方法是由系统自动调用的,不用手动调用。

当把一个对象放入一个集合中(数组、字典、集合)时,会将对象的引用计数加1,因为内部做了retain操作,当collection(数组 集合 字典)空间被回收时,它们会向容器的每一个元素都发送一个release消息(对应添加元素时的retain操作)。当从collection中移除一个元素时,会release该对象,引用计数减1.

 

强引用  弱引用

默认所有的指针变量都是强指针,被 _strong 修饰的指针,弱指针 被 _weak 修饰的指针

stong :用于 OC 对象,相当于 MRC 中的

retain ; weah : 用于 OC 对象,相当于 MRC 中的 assign ;

assign : 用于基本数据类型,跟 MRC 中的 assign 一样

copy :一般用于NSString, 跟MRC中的copy一样

在ARC情况下解决”循环retain”的问题:@property 可以用weak。