开始新篇章!

2015-12-10  本文已影响367人  陈长见

最近,一直在寻找灵感,摸索新技术,提高个人的开发能力,比如swift开源代码,也在研究前端开发,但是偶尔看到一个问题,学了这么久,也做了这么久,突然发现很多东西都忘了,或者说搞不太清楚,就是有些相似的弄混了,最后网上到处找。看完之后我也颇有感受,也想了很久,觉得整理一份重要的总结。

宗旨内容如下:

后续我也会一直讲本文更新下去,有露点或者错误的地方望指出,或者联系我,相互交流技术,谢谢!

好了开始吧。。。。。。。。。。。

一: weak&strong

这并不是垃圾回收,我们用reference count 表示堆上还有多少strong指针,当它变为0就马上释放。

本地变量都是strong,编辑器帮你计算.

补充

retain: release旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 assign: 简单赋值,不更改索引计数 (默认) copy: 其实是建立了一个相同的对象,地址不同(retain:指针拷贝 copy:内容拷贝) strong:(ARC下的)和(MRC)retain一样 (默认) weak:(ARC下的)和(MRC)assign一样, weak当指向的内存释放掉后自动nil化,防止野指针 unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。 autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。1、 类变量的@protected ,@private,@public,@package,声明各有什么含义? @private:作用范围只能在自身类 @protected:作用范围在自身类和继承自己的子类 (默认) @public:作用范围最大,可以在任何地方被访问。 @package:这个类型最常用于框架类的实例变量,同一包内能用,跨包就不能访问

二: category&extension

类别主要有三个作用

三: define&const

四: synthesize&denamic

有些存取是在运行时动态创建的,如在CoreData的NSManagedObject类使用的某些。如果你想这些情况下,声明和使用属性,但要避免缺少方法在编译时的警告,你可以使用@dynamic动态指令,而不是@synthesize合成指令。

五: UIView的setNeedsDisplay和setNeedsLayout方法

综上所述:setNeedsDisplay方便绘图,而layoutSubViews方便出来数据

setNeedDisplay告知视图它发生了改变,需要重新绘制自身,就相当于刷新界面.

六: UILayer&UIView

  1. UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。它本身完全是由CoreAnimation来实现的(Mac下似乎不是这样)。它真正的绘图部分,是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等,实际上内部都是在访问它所包含的CALayer的相关属性。

  2. UIView有个重要属性layer,可以返回它的主CALayer实例。

  3. UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。

  4. UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。

  5. 动画的运作:对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。

  6. 坐标系统:CALayer的坐标系统比UIView多了一个anchorPoint属性,使用CGPoint结构表示,值域是0~1,是个比例值。

  7. 渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示。

  8. 变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性。

  9. 变形:Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATransform3D的一套方法提供了一些魔术般的变换效果。

七: UITableView&UICollection

UICollectionView是iOS6新引进的API,用于展示集合视图,布局更加灵活,其用法类似于UITableView。而UICollectionView、UICollectionViewCell与UITableView、UITableViewCell在用法上有相似的也有不同的,下面是一些基本的使用方法:

对于UITableView,仅需要UITableViewDataSource,UITableViewDelegate这两个协议,使用UICollectionView需要实现UICollectionViewDataSource, UICollectionViewDelegate,UICollectionViewDelegateFlowLayout这三个协议,这是因为UICollectionViewDelegateFlowLayout实际上是UICollectionViewDelegate的一个子协议,它继承了UICollectionViewDelegate,它的作用是提供一些定义UICollectionView布局模式的函数

八:NSProxy&NSObject

NSObjetc:

NSObject协议组对所有的Object-C下的objects都生效。 如果objects遵从该协议,就会被看作是first-class objects(一级类)。 另外,遵从该协议的objects的retain,release,autorelease等方法也服从objects的管理和在Foundation中定义的释放方法。一些容器中的对象也可以管理这些objects,比如 说NSArray 和NSDictionary定义的对象。 Cocoa的根类也遵循该协议,所以所有继承NSObjects的objects都有遵循该协议的特性。

NSProXY:

NSProxy 是一个虚基类,它为一些表现的像是其它对象替身或者并不存在的对象定义一套API。一般的,发送给代理的消息被转发给一个真实的对象或者代理本身load(或者将本身转换成)一个真实的对象。NSProxy的基类可以被用来透明的转发消息或者耗费巨大的对象的lazy 初始化。

九: layoutSubViews&drawRects

layoutSubviews在以下情况下会被调用:

drawRect在以下情况下会被调用:

drawRect方法使用注意点:

十:NSCache&NSDcitionary

NSCache与可变集合有几点不同:

NSCache和NSDictionary类似,不同的是系统回收内存的时候它会自动删掉它的内容。

十一:AFNetworking&ASIHttpRequest&MKNetWorking

一、底层实现

1、AFN的底层实现基于OC的NSURLConnection和NSURLSession
2、ASI的底层实现基于纯C语言的CFNetwork框架
3、因为NSURLConnection和NSURLSession是在CFNetwork之上的一层封装,因此ASI的运行性能高于AFN

AFNetworking的下载地址: https://github.com/AFNetworking/AFNetworking

二、对服务器返回的数据处理

1、ASI没有直接提供对服务器数据处理的方式,直接返回的是NSData/NSString
2、AFN提供了多种对服务器数据处理的方式
(1)JSON处理-直接返回NSDictionary或者NSArray
(2)XML处理-返回的是xml类型数据,需对其进行解析
(3)其他类型数据处理

三、监听请求过程

1、AFN提供了success和failure两个block来监听请求的过程(只能监听成功和失败)
* success : 请求成功后调用
* failure : 请求失败后调用
2、ASI提供了3套方案,每一套方案都能监听请求的完整过程
(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
* 成为代理,遵守协议,实现协议中的代理方法
* 成为代理,不遵守协议,自定义代理方法
* 设置block

四、在文件下载和文件上传的使用难易度

1、AFN
*不容易实现监听下载进度和上传进度
*不容易实现断点续传
*一般只用来下载不大的文件
2、ASI
*非常容易实现下载和上传
*非常容易监听下载进度和上传进度
*非常容易实现断点续传
*下载大文件或小文件均可
3、实现下载上传推荐使用ASI

五、网络监控

1、AFN自己封装了网络监控类,易使用
2、ASI使用的是Reachability,因为使用CocoaPods下载ASI时,会同步下载Reachability,但Reachability作为网络监控使用较为复杂(相对于AFN的网络监控类来说)
3、推荐使用AFN做网络监控-AFNetworkReachabilityManager

六、ASI提供的其他实用功能

1、控制信号旁边的圈圈要不要在请求过程中转
2、可以轻松地设置请求之间的依赖:每一个请求都是一个NSOperation对象
3、可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理所有的请求对象)
* 暂停/恢复/取消所有的请求
* 监听整个队列中所有请求的下载进度和上传进度

MKNetworkKit 是一个使用十分方便,功能又十分强大、完整的iOS网络编程代码库。它只有两个类, 它的目标是使用像AFNetworking这么简单,而功能像ASIHTTPRequest(已经停止维护)那么强大。它除了拥有AFNetworking和ASIHTTPRequest所有功能以外,还有一些新特色,包括:

十二:load&initialize

可以看到这两个方法都是以“+”开头的类方法,返回为空。通常情况下,我们在开发过程中可能不必关注这两个方法。如果有需要定制,我们可以在自定义的NSObject子类中给出这两个方法的实现,这样在类的加载和初始化过程中,自定义的方法可以得到调用。

load和initialize的共同特点

十三:ARC-Block&MRC-Block

block虽然好用,但是里面也有不少坑,最大的坑莫过于循环引用问题。稍不注意,可能就会造成内存泄漏。这节,我将从源码的角度来分析造成循环引用问题的根本原因。并解释变量前加block,和weak的区别。

明确两点

1,Block可以访问Block函数以及语法作用域以内的外部变量。也就是说:一个函数里定义了个block,这个block可以访问该函数的内部变量(当然还包括静态,全局变量)-即block可以使用和本身定义范围相同的变量。 2,Block其实是特殊的Objective-C对象,可以使用copy,release等来管理内存,但和一般的NSObject的管理方式有些不同,稍后会说明。

MRC:防止 block 对self的引用 解决办法

__block typeof(self) weakSelf = self;

ARC:防止 block 对self的引用 解决办法

__weak typeof(self) weakSelf = self;

对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中使用的对象:

对于ARC下, 为了防止循环引用, 我们使用weak来修饰在Block中使用的对象。原理就是:ARC中,Block中如果引用了strong修饰符的自动变量,则相当于Block对该变量的引用计数+1。

十四:MVC&MVVM

总结:

十五:Object&Swift

Obejective-C复杂的语法,更加简单易用、有未来,让许多开发者心动不已,Swift明显的特点有:

十六:TCP&UDP

十七:POST&GET

  1. get是从服务器上获取数据,post是向服务器传送数据。
  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
  3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
  4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
  5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式; 2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

十八:长链接&短链接

我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server 发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起 close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况。从上面的描述看,短连接一般只会在 client/server间传递一次读写操作

接下来我们再模拟一下长连接的情况,client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

长连接短连接操作过程

短连接的操作步骤是:
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接

建立连接——数据传输…(保持连接)…数据传输——关闭连接

什么时候用长连接,短连接?

长连接和短连接的优点和缺点

由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

十九:内存泄露&内存溢出

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

二十:CoreData&SQLite3

首先,coredata和sqlite的概念不同,core为对象周期管理,而sqlite为dbms。

二十一:传值通知&推送通知(本地&远程)

本地通知。

local notification,用于基于时间行为的通知,比如有关日历或者todo列表的小应用。另外,应用如果在后台执行,iOS允许它在受限的时间内运行,它也会发现本地通知有用。比如,一个应用,在后台运行,向应用的服务器端获取消息,当消息到达时,比如下载更新版本的提示消息,通过本地通知机制通知用户。

本地通知是UILocalNotification的实例,主要有三类属性:

对本地通知的数量限制,iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被iOS忽略。

远程通知(需要服务器)。

流程大概是这样的

一般使用极光推送,步骤是一样的,只是我们使用的服务器是极光的,不需要自己大服务器!

二十二:第三方库&第三方平台

二十三:KVO&KVC

底层实现:

KVO概述

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

使用方法

系统框架已经支持KVO,所以程序员在使用的时候非常简单。

1: 注册,指定被观察者的属性,

2: 实现回调方法

3: 移除观察

KVC概述

KVC是KeyValueCoding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性(实例变量)的机制。而不是通过调用Setter、Getter方法访问。

当使用KVO、Core Data、CocoaBindings、AppleScript(Mac支持)时,KVC是关键技术。

使用方法

关键方法定义在:NSKeyValueCodingprotocol

KVC支持类对象和内建基本数据类型。

补充:KVO与Notification之间的区别:

二十四:时间传递&响应者链

事件的产生和传递过程:

一般事件的传递是从父控件传递到子控件的

如果父控件接受不到触摸事件,那么子控件就不可能接收到触摸事件 UIView不能接收触摸事件的三种情况:

响应者链

响应者链条其实就是很多响应者对象(继承自UIResponder的对象)一起组合起来的链条称之为响应者链条

一般默认做法是控件将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理。那么如何判断当前响应者的上一个响应者是谁呢?有以下两个规则:

当有view能够处理触摸事件后,开始响应事件。 系统会调用view的以下方法:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

    可以多对象共同响应事件。只需要在以上方法重载中调用super的方法。

    大致的过程initial view –> super view –> …..–> view controller –> window –> Application

    需要特别注意的一点是,传递链中时没有controller的,因为controller本身不具有大小的概念。但是响应链中是有controller的,因为controller继承自UIResponder。

UIApplication–>UIWindow–>递归找到最合适处理的控件–>控件调用touches方法–>判断是否实现touches方法–>没有实现默认会将事件传递给上一个响应者–>找到上一个响应者–>找不到方法作废

PS:利用响应者链条我们可以通过调用touches的super 方法,让多个响应者同时响应该事件。

二十五:堆&栈

一、堆栈空间分配区别:

* 1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

* 2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

二、堆栈缓存方式区别:

* 1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;

* 2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

三、堆栈数据结构区别:

* 堆(数据结构):堆可以被看成是一棵树,如:堆排序;

* 栈(数据结构):一种先进后出的数据结构。

**内存其他补充: **

二十六:UDID&UUID

在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,我们是使用IMEI作为设备的唯一标识的,可惜的是Apple官方不允许开发者获得设备的IMEI.

    [UIDevice currentDevice] uniqueIdentifier]

但是我们需要注意的一点是,对于已越狱了的设备,UDID并不是唯一的.使用Cydia插件UDIDFaker,可以为每一个应用分配不同的UDID. 所以UDID作为标识唯一设备的用途已经不大了.

由网上资料显示,UUID是一个软件建构的标准,也是被开源软件基金会(Open Software Foundation,OSF)的组织在分布式计算环境(Distributed Computing Environment,DCE)领域的一部份.UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定.

二十七:CPU&GPU

二十八:点(pt)&像素(px)

当你为多种显示设备设计时,你应该以“点”为单位作参考,但设计还是以像素为单位设计的。这意味着仍然需要以3种不同的分辨率导出你的素材,不管你以哪种分辨率设计你的应用。

二十九:属性与成员变量:

成员变量是不与外界接触的变量,应用于类的内部,如果你说那用@Public外部不就是可以访问了么。简单的说public只能适当使用,不要泛滥,否则就像你把钥匙插在你自己家门上了。谁来都可以开门。毫无安全性。

由于成员变量的私有性,为了解决外部访问的问题就有了属性变量。属性变量个人认为最大的好处就是让其他对象访问这个变量。而且你可以设置只读、可写等等属性,同时设置的方法我们也可以自己定义。记住一点,属性变量主要是用于与其他对象相互交互的变量。

如果对于上面所说还是含糊不清那就记住这几点吧!

.........

待续。。。。。。。。。。

上一篇 下一篇

猜你喜欢

热点阅读