美文网首页
(GeekBand)Objective-C第一周

(GeekBand)Objective-C第一周

作者: ad951f2b2664 | 来源:发表于2016-07-18 00:07 被阅读77次

Objective-C简介

 Objective-C 语言在1983年由Brad Cox 和Tom Love发明,同时OC高度兼容C语言 是一门在C语言基础上做了面向对象扩展的编程语言

掌握高级编程语言的思维方式

  底层思维:将人的思维转换为机器的思维并且从微观、机器的层面理解语言的构造、编译转换、内存模型和运行时机制

  抽象思维:将我们周围世界抽象为程序代码,即面向对象的思维方式,组件封装、设计模式、架构模式

“时空人”三位一体分析方法

时间分析,代码执行时发生在什么时候?编译时还是运行时

空间分析,程序中变量放在哪里?堆上还是栈空间上

人物分析,代码哪里来的?程序员还是编译器帮我们准备好的

Objective-C中的类型系统

引用类型->类(class)、指针(pointer)、块(block)

值类型->基础数据类型(int float..)、结构体(struct)、枚举(enum)

类型装饰->协议(protocol)、类别(category)、拓展(extension)

类与对象

举个例子 猫科动物可以理解为一个类 而各种不同品种的猫可以理解为对象 需要注意 类中的每个对象 都是相对独立的

在Xcode中新建一个类的方法:command+N 选择cocoa touch class 继承自NSObject(假设没有需求继承其他类)会自动生成XXX.h和XXX.h的头文件 .m为实现文件 .h为声明文件

在main.m中新建一个类中的对象(假设类为Person继承自NSObject)

引入#import "Person.h"头文件

Person *p1 = [[Person alloc]init]; 其中 alloc为向系统发送一个消息 请求分配内存 init为初始化

OC中的类型成员

-数据成员(data member)描述对象状态-> 实例变量(instance variable)以及属性(property)

-函数成员(function member)描述对象行为->方法(method)、初始化器(init)、析构器(dealloc)

-属性(property) 表达实例状态 是实例变量对外接口 相比直接访问实例变量 属性可以做更多控制

-属性(property)相对应的有编译器自动合成的实例变量_propertyName 以及getter(propertyName)方法和setter(setPropertyName)方法

-同时属性还可以自定义访问器方法,也可以更改访问器方法或实例变量名(后两者并不常用)

-使用静态全局变量 +类方法模拟类属性

-实例变量(instance variable)可以单独定义实例变量而不定义属性 需注意 只有实例变量 没有类变量

-如果同时定义了getter和setter访问器方法 或者针对只读属性定义了getter访问器方法 编译器将不再合成实例变量

-在类外统一使用属性访问,类内大多通过self使用属性访问 只有在以下三种情况使用实例变量来访问

1.初始化器(init)

2.析构器(dealloc)

3.自定义访问器方法

-实例变量的生存周期

-实例变量的存储:跟随对象实例存储在堆上

-值类型变量直接内嵌在对象实例中 跟随对象实例内存释放而被释放

-引用类型实例变量通过指针引用堆上的引用类型实例 ARC会针对引用进行引用计数管理并自动释放引用计数为0的对象

-关于属性和实例变量 我们作为初学者可以暂且理解成 对外使用属性 对内使用实例变量 初始化使用实例变量

函数成员:方法

-方法可以表达实例行为或者类型行为 OC只有方法的重写 没有方法的重载

-方法又分为:类方法(+)以及实例方法(-)

-类方法(+)->表达类型行为 访问权限:可以访问类型方法 静态变量 不可以访问实例成员(实例变量 实例属性 实例方法)

-在main.m文件中调用类方法需要以类名调用 以上文的Person为例 如果在Person.h文件中定义了+(void)print的方法 以[Person print]这样的形式调用

-实例方法(-)->表达实例行为 访问权限:实例成员(实例属性、实例变量、实例方法)以及类方法和静态比阿尼浪

-在main.m调用实例方法需要以对象名来调用 假设在Person.h文件中定义了-(void)printHello的方法 以[p1 printHello]这样的形式调用

-上文中的[Person alloc]为类方法 [[Person alloc]init]则为实例方法

-方法的参数

1.如果参数类型为值方式 则为传值方式;如果参数类型为引用类型 则为传指针方式 例如:-(void)printAge:(int)age ; -(void)printName:(NSString *)name;

2.方法可以没有参数也可以没有返回时 例如:-(void)printHello;

3.如果方法有参数 方法名约定包含第一个参数名,从第二个参数开始需要显示提供外部参数名

4.调用时,第一个参数名忽略 单后面的参数名必须显示标明

初始化器与析构器

初始化器用于初始化对象实例或者类型

-对象初始化器 -(id)init -(instancetype)init 可以有多个 -(id)可以适用与所有类 -(instancetype)只适用于当前类

-类初始化器 +(void)initialize 只能有一个

析构器用于释放对象拥有的资源 无返回值

-对象析构器-(void)dealloc 只能有一个 负责释放对象拥有的动态资源

            1.自动实现: ARC将对象属性引用计数减持(-1)

            2.手动实现:释放不受ARC管理的动态内存 例如:malloc

            3.手动实现:关闭非内存资源,如文件句柄、网络端口...

需注意dealloc由ARC根据对象引用计数规则 在释放对象内存前调用 无法手工调用 并且子类的dealloc会自动调用父类的dealloc(后置调用)

-没有类型析构器

重写初始化器init的步骤

-调用父类初始化器 [super init]前置调用

-判断self指针是否存在 if(self)

-如果指针不为空 则初始化当前类的实例变量 在初始化器中使用实例变量 而不是属性 并且可以对属性做一个copy 防止self指针指向相同的对象

-return self

在一个类中 如果有多个初始化器 则对参数最多的那个初始化器进行初始化 对其他的初始化器进行调用该初始化器的方法

面向对象的三大要素

-封装(encapsulation) 隐藏对象内部细节 对外仅提供公共接口访问 例如:一天的花销 你只知道花了多少钱 而不知道具体用在了哪里

-继承(inheritance) 一个类型在另外类型基础上进行拓展的实现 例如:某个人继承了家产 但是他可以对家产进行重新分配

-多态(polymorphism) 不同类型针对同一行为接口的不同实现方式 例如 你对动物发出叫的命令 猫和狗会发出不同的叫声

认识继承:

-每一个类只能有一个基类 子类自动继承基类的实例变量、属性、实例方法、类方法

-NSObjec是所有类的根类

-继承的含义:1.成员复用 子类复用基类成员 类型抽象 将子类当做父类来使用(IS-A关系准则) 例如:BMW is a car

继承中的init和dealloc:

-初始化器init: 子类自动继承基类的初始化器 同时子类可以重写基类的初始化器,但是必须先调用基类的一个初始化器(手动调用)

-析构器dealloc: 子类可以选择继承基类的析构器 或者重写基类析构器 子类析构器执行完毕以后 会自动调用基类析构器(后只调用 且不支持手工调用) 需注意 子类析构器自动具有多态性

-尽量避免在父类初始化器和析构器中调用子类的重写方法 

认识多态:

-子类在父类统一行为接口下 表现的实现方式(上文提到的动物叫声)

-子类重写父类同名同参数方法;子类只可以重写父类方法

-在子类的代码中 可以使用super来调用基类的实现

需注意 self具有多态性 可以指向不同子类 super 没有多态性 仅指向当前父类

相关文章

网友评论

      本文标题:(GeekBand)Objective-C第一周

      本文链接:https://www.haomeiwen.com/subject/hpfjjttx.html