搜索
您的当前位置:首页正文

【转】iOS知识树,知识目录(包括对象、Block、消息转发、G

来源:二三娱乐

/->UIViewController

|ViewController在iOS只是一个非常重要的概念,其在一个App中所扮演的角色,

|(1) View Management:管理View     (2) Data Marshalling:管理数据

|(3) User Interactions:响应用户交互 (4) Resource Management:管理资源

|(5) Adaptivity:适配不同的屏幕尺寸空间的变化

|ViewDidLoad调用时机:当view被首次使用的时候,某些情况可提升性能

|->UIView

|frame 是相对父试图坐标的值; bound是本身坐标系统的值

|善于使用hidden 使用animateWithDuration简单地控制页面切换效果

|->CALayer

|->UIWindow

|每一个IOS程序都有一个UIWindow

|keyWindow是指定的用来接收键盘以及非触摸类的消息,

|而且程序中每一个时刻只能有一个window是keyWindow。

|->UIImage

|[UIImage imageNamed:@“xxx”] 系统缓存到cache中

|[UIImage imageWithContentsOfFile:path] 不缓存

|[UIImage imageWithData:data]  不缓存

|没有上下居中对齐,可以使用TTTAttributedLabel

/

/->UIKit

|\

||->UIButton

||设置颜色,文字一定要指定button状态

||设置圆角可layer.cornerRadius

||->UITextfield

||隐藏键盘,[textfield resignFirstResponder]

||->UITableView

||复用,注意重写 - (void)prepareForReuse

||dequeueReusableCellWithIdentifier 从重用池中获取,可能是nil

||dequeueReusableCellWithReuseIdentifier 同上,但是不会是nil

||1. 更新dataSource的数据

||2. 调用相应的collection view方法删除或者插入section或item

||因为collection view总是假设你已经准备好打他source了 否则collection view收到错误的item,并造成crash

||->UIDevice

||设备名 [UIDevice currentDevice].name,

||屏幕旋转方向 [[UIDevice currentDevice] orientation]

||区分iPad还是iPhone [UIDevice currentDevice].userInterfaceIdiom);

||->UIScreen

|\->自动布局

|Masonry

|

|/->NSObject既是对象也是协议,可以将对象自动置nil 比如 int = 0 bool = NO

||isKindOfClass:和isMemberOfClass:,通过这两种方法可以确定一个类的从属关系\

||后者测试一个接收器是否是一个指定类的实例;而后者可以测试类的从属关系。

||respondsToSelector: 方法测试一个接收器是否通过selector实现(implements)了一个标志符话的方法

||description方法,允许一个对象返回一个字符串来描述它的内容;这个常用于调试debug

||encodeWithCoder: 和 initWithCoder:方法,NSCoding协议中仅有的组成成员\

||第一个允许对象编译它的实例变量,第二个允许一个对象初始化它自身的解码实例变量。

||conformsToProtocol:方法,测试接收器(对象或者类)符合一个给定的协议(protocol)

||->NSString & NSMutableString

||NSString作为属性时候,用copy还是strong修饰?

||->NSArray & NSMutableArray

||NSArray简便初始化方法@[@"1",@"2"];

||无论copy、arrayWithArray、copyWithZone 数组内对象并没有变。

||只是copy出来的array是新地址,arrayWithArray出来的数组也是新地址。

||深拷贝。数组本身使用地址,但是数组item是新地址

||[[NSArray alloc] initWithArray:someArray copyItems: YES];

||深拷贝时候,数组中的item必须实现NSCopying协议并实现copyWithZone:

||array包含array的情况深拷贝。NSArray* trueDeepCopyArray = [NSKeyedUnarchiver \

||unarchiveObjectWithData: [NSKeyedArchiver archivedDataWithRootObject:oldArray]];

||->NSDictionary & NSMutableDictionary

||取值时候,最好判断object的类型。    if ([object isKindOfClass:[NSString class]]){ //todo};

||->NSNumber 和 NSInteger NSRange

||前者专门用来装基础类型的对象,把整型、单精度、双精度、字符型等基础类型存储为对象

||->NSData字节缓冲区

||可用于APP setting默认值不好用,SDK bug

||->NSDate & NSDateFormatter &NSCalendar

||可判断过去几个小时,还是几天 - (NSDateComponents *) components:fromDate:toDate:options:

||可获取时间戳

||- (void)encodeWithCoder:(NSCoder *)aCoder;

||- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;

||->NSCopying & NSZone

||->NSAutoreleasePool

||->NSFileManager删除文件的时候先判断是否存在是个好习惯

||->NSTimer

|/

|->Foundation

|\

||初始化 [NSIndexPath indexPathForRow:0 inSection:1];

||->NSError网络变成经常用到

||->NSException

||->NSProgressIndicator

||->NSNetServiceBrowser

||通过URL将数据下载到文件系统

||将数据上传到指定URL

||->NSPredicate

||->NSLayoutConstraint

||->NSLock & NSRecursiveLock & NSCondition多线程锁

||->NSMethodSignature

\|iOS中可以直接调用 某个对象的消息 方式有2种performSelector:withObject: 和NSInvocation

||->NSSet无序的对象集合,用处少

|

|/

|->Push

|\

|\->有一些三方push SDK:极光push

|

|->block必须掌握

|->多线程

|1、NSThread 下面会讲到

|2、Cocoa NSOperation 下面会讲到

|3、GCD 下面会讲到

|这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单。

|

|/->引用计数(retainCount)

||retain 引用计数+1 对象alloc时,引用计数为1, release引用计数-1.引用计数=0时候,真正释放

||->便捷构造方法 iOS

||对象在自动释放池中,不需要开发者手动释放,比如下面的方法

||NSString的stringWithString

||NSArray的arrayWithObjects:和arrayWithArray:

||UIImage的imageNamed:

|/

|\

||->MRC手动引用计数。release和retain成对儿

|\->ARC自动引用计数

|

|/->Runtime运行时特点

||class_copyPropertyList  获取类的属性

||class_isMetaClass 判断是否为元类

||class_getName 获取类名

||class_copyIvarList 拷贝类的实例变量列表

||class_getInstanceMethod 获取实例方法

||RunLoop 实际上就是一个对象,这个对象管理了其需要处理的事件和消息

||并提供了一个入口函数来执行上面 Event Loop 的逻辑

|/

|->iOS 动态机制

|\

||如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用的方法

||objc_msgSend有两个隐藏参数,消息接收对象 方法的selector ,即(self,_cmd)

||就是对象在接收到无法解读的消息之后会发生什么情况

||(1) +(BOOL) resolveInstanceMethod:(SEL)selector 类是否新增一个实例方法

||(2) resolveClassMethod 是否新增了类方法

||(3) -(id) forwardingTargetForSelector:(SEL)selector 能不能把这条消息转给其他接收者来注册

||(4)-(void) forwardInvocation:(NSInvocation*)invocation  消息派发系统

||(5)最后若都不能处理消息,则doesNotRecognizeSelector: 会抛出异常

||SEL又叫选择器,是表示一个方法的selector的指针,每一个方法都对应着一个SEL。

||IMP 它是objetive-C 方法(method)实现代码块的地址,实际上是函数指针,指向方法实现的首地址

||Swizzling应该总是在+load中执行

|在 iOS 中,几乎所有类都是 responder,比如 UIWindow、UIView、UIControl、UIControllers 等

|当手指去触摸屏幕上 UIView 的实例对象 aView。产生一个触摸事件 UIEventTypeTouches

|而接收触摸事件的对象 aView,就是一个 responder object。

|initial view –> super view –> …..–> view controller –> window –> Application –> AppDelegate

|

||每个应用程序都有自己的存储空间

||应用程序不能翻过自己的围墙去访问别的存储空间的内容

||应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。

||系统提供一个叫做 主队列(main queue)

||系统还提供一个叫做全局调度队列(Global Dispatch Queues)有四个优先级

||开发者自己创建队列(串行,或者并行)

||开发常见方法介绍

||dispatch_after 延后工作

||Dispatch Groups 会在整个组的任务都完成时通知你

||dispatch_semaphore_wait  使得信号量-1,当=0时候阻塞

||dispatch_semaphore_signal  释放信号量,即信号量+1

||

||数据库字段或者表有更改会导致crash,CoreData的版本管理和数据迁移变得非常有用,\

||手动写sql语句操作还是麻烦一些。

||不光能操纵SQLite,CoreData和iCloud的结合也很好,如果有这方面需求的话优先考虑

||并不是直接操纵数据库,比如:使用CoreData时不能设置数据库的主键,目前仍需要手动操作。

||效率上其实跑程序时感觉不出来,毕竟手机上的数据不能跟网站的数据和访问量相提并论。

|/

|->iOS 特殊封装&平台特性

|\

||->KVC键值编码

||->KVO键值观察

||为什么KVO不成对儿调用,会崩溃?

||->多任务

||->3D Touch,通过在plist中添加菜单,然后app实现下面的方法。进入APP

||- (void)application: performActionForShortcutItem: completionHandler:

|

|

\->iOS工具

CrashHlytics Crash统计工具

AFHttp 和 ASIHttp

SDImage

------------------------------------------------------------------------------------------

参考文献:《Objective-C高级编程:iOS与OS X多线程和内存管理》日本人写的;

《Effective Objective C 2.0:编写高质量iOS与OS X代码的52个有效方法》;

《Objective-C基础教程(第2版)》

Top