美文网首页
GeekBand oc课程笔记

GeekBand oc课程笔记

作者: 随枫752 | 来源:发表于2016-03-07 00:58 被阅读0次

    oc课程笔记

    堆和栈的区别

    指针是存放在“栈”上,而对象时存放在“堆”上的,访问对象职能通过指针的方式来访问。

    栈:(stack)存储的是值类型无ARC (自动引用计数,即原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成)负担,由系统自动管理,以执行函数单位,空间大小在编译时确定(参数+局部变量)函数执行时,系统会自动分配一个stack,结束时回立即收回,函数之间通过拷贝值传递,大小有限额通过拷贝值来传递。所有函数都存放在栈上。

    堆:储存引用类型对象,创建对象时由人工手动请求,释放由运行时的arc自动释放,函数之间通过指针来传递,总体无大小限制(受制于系统内存)。

     属性与实例变量

    属性与实例变量都是oc的类型成员

    属性(对外访问):表达实例状态,描述类型对外接口相比直接访问实例变量,属性可以做更多控制。(getter访问器方法为读值,setter访问器方法为赋值)在有属性的情况下,尽量用属性访问,类外一律用属性访问,类内通过self使用属性访问。

    实例变量(对内访问):类外不能访问实例变量,只能在类内访问,其命名规则为_属性)只有实例变量,没有类型变量,实例变量是跟随对象存储子啊堆上的,值类型的实例变量“内嵌”在对象实例中,跟随对象实例内存释放而释放,引用类型的实例变量通过指针“引用”在堆上的引用类型实例,arc针对引用进行计数管理,自动释放引用计数为0的对象

    arc环境:强引用为默认,弱引用weak起组织循环引用的作用

    函数成员

    函数:代码段上的可执行指令序列,方法是类的成员函数,表达实例行为或类行为所有的方法默认为共有方法。动态消息分法:方法调用通过运行时消息分发实现,在对象上调用方法为“向对象发送消息”

    实例方法:表达实例行为,可以访问当前实例对象成员有(实例属性、实例变量、实例方法)用“-”表示

    类型方法:表达类型行为,用“+”表示,可以访问类型方法、静态变量,部能访问实例成员,其中的self表示当前类。

    如参数类型为值,则为传值方式,如果参数类型是引用类型,则通过传指针的方式。方法可以没有参数,也可以没有返回值,如果方法有参数,方法名约定包含一个参数名,从第二个参数开始需要显示提供外部参数名(内外2种参数时,第一个单词小写,第二个单词首字母大写)调用时,第一个参数名忽略,但后面但参数名必须显示标明

    初始化器:用于初始化对象实例或类型,是一个特殊的函数分为:

    对象初始化器-(id)init 可重载多个,初始化对象实例时init通常和alloc搭配使用,在这里alloc在堆上分配适合大小的内存,将属性或者实例变量的内存置0,init调用父类初始化器([super init]前置调用),初始化当前实例变量。

    类型初始化器+(viod)initialize只能有一个,initialize负责类型级别的初始化,在每个类使用之前被系统自动调用且每个进程周期中只能被调用一次,子类的initialize会自动调用父类的initialize。

    对象析构器-(void)dealloc只能有一个负责释放对象拥有的动态资源1.arc将对对象属性引用计数减持(自动实现)2.释放不收arc管理的动态内存如:malloc分配的内存(手动实现)3.关闭非内存资源,如文件句柄,网络端口等(手动实现)dealloc由arc根据对象引用计数规则,在释放对象内存前自动调用,无法手工调用,子类的dealloc无法调用父类的dealloc。

    封装:encapsulation隐藏内部实现细节,对外仅提供公共接口访问

    继承:inheritance一个类型在另外类型基础上进行扩展实现,每个类只能由一个基类,子基类自动继承基类的实例变量、属性、类方法,其含义为1.成员复用,子类复用基类成员2.类型抽象,将子类当作父类来使用,所有类的根类为:NSobject.

    多态:polymorphism不同类型针对同一行为的不同实现方式,子类在父类统一行为接口下,表现不同到实现方式。子类只可以重写父类方法,方法名相同、参数不同的oc不支持方法重载,在子类代码中,可以使用super来调用基类的实现。

    字符串 NSString:是一个Unicode编码16位字符的字符序列,被定义为类,引类型,在拷贝时具有引用意义。

    NSString的初始化方法有三种例如:

    NSString *str1 = @"Hello World!";//字面量初始化

    NSString *str2 = [[NSString alloc]initWithCString:"Hello World!" encoding:NSUTF8StringEncoding];//初始化器

    NSString *str3 = [NSString stringWithCString:"Hello World!" encoding:NSUTF8StringEncoding];//工厂方法

    NSString:拥有恒定性,所有的操作方法无法改变字符串本身,都是以返回新值的方式改变。拥有共享机制,引用计数管理对其有特殊的管理规则。例如:

    NSString *str1 = @"Hello World!"与NSString *str4= @"Hello World!"的指针地址是同一个。

    NSMutableString是NSString的子类,其具有可变性,不具有共享机制,而NSSting作为其父类具有恒定性,有共享机制。

    NSMutableString并不是在原有内存上直接增长,而是重新分配一个更大或更小的缓存容量存放字符。

    缓存容量与增长:字符串初始化后,会分配一个缓存容量capacity,其长度一般大于字符串的实际字符数量,当字符串增长时,如果实际需求大于capacity,会以2倍方式指数增涨过程为=====》1,分配新的内存2*capacuty。2,将原来堆内存上的内容拷贝到新的内存。3,释放原来的内存。最后事先估计好capacity的大小,预先分配好容量,避免以后capacity的增长。

    数组:是一个有序的元素序列,支持随机存取,索引从0开始,索引访问越界会抛出运行时异常,与c语言中的数组不同,NSArray,被定义为class,引用类型,拷贝是具有引用语义

    NSArray:的元素必须是对象,是NSObject的子类1,基本数值类型必须用NSNumber封装为对象类型后才能放入数组2,c语言结构类型,必须用NSValue封装为对象类型后,才能放入数组3,数组元素可以是不同对象类型,可能会有类型不安全(取元素可能取到不同类型)

    NSArray:具有常量性,长度和元素指针都不能改变,但指针的对象内部可以改变。

    数组的遍历方式的快慢:

    (Fast Enumeration,直接访问内存,优化索引检查)>(NSEnumerator遍历:索引检查+动态消息调用)>(for循环访问:索引检查+动态消息调用)

    数组在查找“值相等”等对象时用:indexOfObject(类型需要实现isEqual)

    数组在查找“指针相等时”用indexOfObiectIdenticalTo,数组在排列时不改变原数组,而是返回新数组

    可变数组NSMutableArray:支持更改数组长度和元素指针,是NSArray的子类NSMutableArray初始化,会分配一个缓存容量capacity,一般大于实际元素数量,当增长时,如实际需求量大于capacity其会以近似二倍方式指数增长,其代价为:

    1,分配新的堆内存2*capacity 。2,将原来的堆内存上的元素拷贝到新的内存。3,释放原来的内存。

    尽量避免使用insertObject:atIndex(所有元素后移)和removeObjectAtIndex(所有元素往前移)等操作,因为会改变数组元素序列,涉及大量内存拷贝操作。

    NSSet是一个无序集合,其储存的对象不能重复,NSSet被定义为class引用类型,拷贝时具有引用语义。

    ARC:(Automatic Reference Counting)时oc默认的内存管理机制,其针对堆上的对象,由编译器自动生成操作引用计数的指令(retain或release)来管理对象的创建与释放。接受ARC管理的对象有:1,oc对象指针。2,Block指针。3,使用_attribute_定义的typedef。不受ARC管理的对象有:1,值类型。2,使用其他方式分配的对象(如malloc分配)。3,非内存资源。

    对象引用计数计数增1(retain)操作:1,将对象引用赋值给其他变量或常量。2,将对象引用赋值给其他属性或者实例变量3,将对象传递给函数参数,或者返回值。4,将对象加入集合中。

    对象引用计数减1(release)操作:1,将局部变量或全局变量赋值为nil或其他值。2,将属性赋值为nil或其他值。3,实例属性所在的对象被释放。4,参数或局部变量离开函数。5,将对象从集合中删除。引用计数变为0时,内存自动被释放。

    Autorelease Pool(自动释放池):release会导致对象立即释放,如果频繁的释放,可能会造成琐碎的内存管理负担。autorelease可以将release的调用延迟到自动释放池被释放。当结束时所有接受autorelease消息的对象会立即被释放。

    协议(Protocol):类型的合同约定,只描述外部接口,不提供具体实现包含:

    1,属性。2,实例方法。3,类方法。4,初始化器。5,析构器。4和5不常用。

    不包含实例变量成员,协议中定义的属性本质上是访问器方法,编译器不会合成实例变量。协议本质上是一种类型,可以作为声明类型,但不能创建实例。

    注意:遵守协议后却没有实现必选协议方法以及协议类型变量被赋值非协议对象时,oc编译器会出现警告实际上时错误。

    相关文章

      网友评论

          本文标题:GeekBand oc课程笔记

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