首页
文章
留言
首页
文章
留言
iOS开发之面向对象
2016 年 11 月 11 日
移动应用
iOS
#### 面向过程: 使用步骤划分功能,然后用函数一步一步的调用。 #### 面向对象: OOP (Object Oriented Programming) 使用功能来简化问题。 **重点概念: **对象、类、封装、继承、多态等等。 **面向对象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(访问器)。设置器用来为实例变量赋值,访问器用来取实例变量的值。 **属性:** ```objectivec @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` 发消息,可以执行父类中实现的方法。 初始化方法创建对象分两步:开辟空间、初始化。 **初始化方法的主要作用:**为某些实例变量赋初值初始化方法在对象的整个生命周期里只使用一次。 完整的初始化方法: ```objectivec -(id) init { self = [super init]; //执行父类中实现的init方法 if (self){ //初始化设置 } return selft; } ``` **便利构造器:**封装了对象创建过程 `Block` 的使用;`Block` 允许嵌套定义,定义时最后加;返回值可以省略。如: ```objectivec 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` ; > **weak:**用于 OC 对象,相当于 MRC 中的 `assign` ; > **assign:**用于基本数据类型,跟 MRC 中的 `assign` 一样; > **copy:**一般用于 `NSString` , 跟 MRC中的 `copy` 一样。 在 ARC 情况下解决 ”循环retain” 的问题:`@property` 可以用 `weak`。
0
相关文章
iOS开发之类与类扩展
iOS开发之多线程
iOS开发之WiFi传输文件
iOS开发之定时执行任务
iOS开发之Touch ID指纹解锁实例
全部分类
前端
后端
运维
架构
算法
数据库
移动应用
桌面应用
程序开发
热门标签
Docker
Objective-C
Git
Lua
iOS
C++
CentOS
GUI
JavaScript
Shell
Python
Kafka
Sphinx
Composer
CSS
PHP
MySQL
爬虫
macOS
Redis
OpenResty
Qt
Linux
Nginx
Elasticsearch
Supervisor
Android
MongoDB
HTML
NoSQL
Kubernetes
多线程
热门文章
PHP开发之字符串处理
Redis基本使用总结
Redis、MemCache、MongoDB比较
iOS开发之面向对象
Supervisor使用总结
iOS开发之多线程
PHP使用Kafka
iOS开发之定时执行任务
macOS常用命令
OpenResty+Lua+Kafka收集日志