2016.05笔记

2016-05-10  本文已影响0人  大写的程序员

RunTime

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等。

这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码。对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行。这个运行时系统即Objc Runtime。Objc Runtime其实是一个Runtime库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。

所谓运行时,也就是在编译时是不存在的,只是在运行过程中才去确定对象的类型、方法等。利用Runtime机制可以在程序运行时动态修改类、对象中的所有属性、方法等。

在使用运行时的地方,都需要包含头文件:#import<objc/runtime.h>

1、Category增加属性

2、NSCoding的自动归档和自动解档

3、字典和模型的自动转换

4、系统自带方法动态重写

5、获取类的所有成员变量的类型和名称

6、动态地创建一个类(KVO的底层实现)


【Objective-C】垃圾回收机制和ARC

ARC:自动引用计数(automatic reference counting),当你在编译程序时提供自动管理内存的功能,它会为程序自动加入内存的控制Retain/Release,底层机制依旧是引用计数对内存进行管理。

垃圾回收:objective-c 2.0引入了自动内存管理机制,也被称为垃圾回收。垃圾回收功能只支持OS X应用开发,无法用在iOS应用程序上。因此iOS程序是要管理内存的,ARC不是自动内存管理,只是在编译的时候适当插入Retain/Release.


属性修饰

atomic:原子操作,加了原子锁,是Setter/Getter两个函数的原语操作,相当于在函数首尾加上了锁,当多个线程操作Setter/Getter函数时,一个线程执行完毕之前,不会出现另一个线程执行的情况,这样可以保证线程安全,默认是atomic

nonatomic:非原子操作,单线程使用这个,因为效率比较高,多线程会有可能线程不安全。

readonly:只会生成Getter方法,不会生成Setter方法

readwrite:生成Getter和Setter方法

copy:复制一个对象并创建strong关联,引用计数为1 ,原来对象计数不变,修饰NSString时为深复制,内容拷贝。可用来修饰block,将block移到堆里面,使得block被声明的作用域被销毁仍可继续使用

strong(Retain):对原对象引用计数加1。指针拷贝,修饰NSString时为浅复制。

assign:对指针赋值不涉及引用计数的变化,弱引用。对象不能使用assign,数据类型(BOOL、int、float)使用

weak:修饰基础类型外的NSObject和其他子类,比assign多了一个功能,对象释放后把指针置为nil,避免了野指针。assigin 可以用非 OC 对象,而 weak 必须用于 OC 对象。

变量修饰

_ _strong:是缺省的关键词,强引用。

_ _weak:声明了一个可以自动置nil的弱引用(ARC中)。

_ _unsafe_unretained:声明一个弱引用,但是不会自动nil化(只有iOS 4 才应该使用)。

_ _autoreleasing:用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放(类似autorelease)。


iOS常用模式

1、MVC

2、代理模式:Delegate

3、观察者模式:只发布消息,不关心谁接收,NotificationCenter,KVO

4、单例模式:[NSUserDefaults standardUserDefaults]

5、装饰器模式:装饰器模式在不修改原来代码的情况下动态的给对象(而不是类)增加新的行为和职责,Category

6、工厂模式:类方法,[NSNumber numberWithBool];

上一篇下一篇

猜你喜欢

热点阅读