美文网首页iOS
iOS开发学习笔记 -tableView优化/内存管理等

iOS开发学习笔记 -tableView优化/内存管理等

作者: DreamMmMmM | 来源:发表于2016-07-05 19:58 被阅读904次

    一、tableView的优化

    tableView核心思想就是UITableviewCell的重用机制。简单的理解就是:UITableView只会创建一屏幕(或一屏幕多一点)的UITableViewCell,其他都是从中取出来重用的。每当Cell滑出屏幕时,就会放入到一重用池中,当要显示某一位置的Cell时,会先去重用池中取,如果有,就直接拿来显示;如果没有,才会创建。这样做的好处是极大的减少了内存的使用。

    •提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;

    •滑动时按需加载,这个在大量图片展示,网络加载的时候效果很明显。

    •尽量把views设置为不透明:当opque为NO的时候,可提高性能;

    •正确使用reuseIdentifier来重用Cell

    •减少subviews的数量

    •在heightForRowAtIndexPath:中尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果

    尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示

    最好不要用xib和storyboard,手动写代码

    二、内存管理的基本原则

    •ios5.0之前:OC内存管理遵循“谁创建,谁释放,谁引用,谁管理”的机制,当创建或引用一个对象的时候,需要向她发送alloc、copy、retain消息,当释放该对象时需要发送release消息,当对象引用计数为0时,系统将释放该对象,这是OC的手动管理机制(MRC)。

    •目前:iOS5.0之后引用自动管理机制——自动引用计数(ARC),管理机制与手动机制一样,只是不再需要调用retain、release、autorelease;它编译时的特性,当你使用ARC时,在适当位置插入release和autorelease;它引用strong和weak关键字,strong修饰的指针变量指向对象时,当指针指向新值或者指针不复存在,相关联的对象就会自动释放,而weak修饰的指针变量指向对象,当对象的拥有者指向新值或者不存在时weak修饰的指针会自动置为nil。

    •如果使用alloc、copy(mutableCopy)或者retian一个对象时,你就有义务,向它发送一条release或者autorelease消息。其他方法创建的对象,不需要由你来管理内存。

    •向一个对象发送一条autorelease消息,这个对象并不会立即销毁,而是将这个对象放入了自动释放池,待池子释放时,它会向池中每一个对象发送 一条release消息,以此来释放对象.

    •向一个对象发送release消息,并不意味着这个对象被销毁了,而是当这个对象的引用计数为0时,系统才会调用dealloc方法,释放该对象和对象本身它所拥有的实例。

    其它注意事项

    •block中为了避免循环引用问题,使用_weak描述;

    •声明属性时,不要以new开头

    •在非ARC工程中采用ARC去编译某些类:-fobjc-arc。

    •在ARC下的工程采用非ARC去编译某些类:-fno-fobjc-arc。

    三、imagName: 和imageWithContentsOfFile的区别

    imageNamed:这个方法用图片的名字在系统缓存中查找,如果它存在的话,返回一个图片对象,如果缓存中没有找到相应的图片,这个方法会自动找到这个图片并加载缓存然后返回这个对象,下一次用到这个图片的时候会直接从缓存中取到。因此imageNamed的优点是当加载时会缓存图片。所以当图片会频繁的使用时,那么用imageNamed的方法会比较好,不需要每次都加载,节省了时间。因此使用imageNamed会缓存图片,即将图片的数据放在内存中,他不会自动释放,只有在iOS的内存消耗过大时,会强制释放内存,即会遇到memorywarnings。但在iOS系统里面释放图像的内存是一件比较麻烦的事情,有可能会造成内存泄漏。

    imageWithContentsOfFile:仅加载图片,图像数据不会缓存。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。

    四.MVC模式理解

    MVC (Modle View Controller)模型(model)视图(view)控制器(controller)

    IOS开发中使用此模式的好处是,可以将M和View实现代码分离,使一个程序展现不同的表现形式,比如想要展示一些数据可以用tableView也可以用CollectionView。而controller可以让M和V保持同步,从而展示在屏幕上。

    为什么 要使用MVC设计模式

    多个视图能共享一个模型,模型返回的数据能被不同的界面使用,从而展示不同的形式。模型与视图控制器和视图分离,如果数据源换了,只需要改变模型即可。只要模型正确,不管数据来自哪里,视图都会正确的显示出来。运用MVC的应用程序的三个部件是相互独立的,盖面其中一个不会影响其他两个。而控制器的话,可以根据用户的需求选择模型进行展示。

    五、KVC机制的原理

    当通过KVC调用对象时,比如:[selfvalueForKey:@”someKey”]时,程序会自动试图通过下面几种不同的方式解析这个调用。

    首 先查找对象是否带有 someKey这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量,如果还没有找到,程序会继续试图调用 -(id)valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。

    valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,响应这个请求。

    六、UIViewController的完整生命周期

    一、调用顺序:

    -[ViewControllerinitWithNibName:bundle:];

    -[ViewControllerinit];

    -[ViewControllerloadView];

    -[ViewControllerviewDidLoad];

    -[ViewControllerviewWillDisappear:];

    -[ViewControllerviewWillAppear:];

    -[ViewControllerviewDidAppear:];

    -[ViewControllerviewDidDisappear:];

    1. + (id)alloc

    分配内存;

    2.-initWithNibName:bundle:初始化对象,初始化数据;

    3.-(void)loadView如果使用Xib创建ViewController,就不要重写该方法。一般不会修改此方法;

    4. - (void)viewDidLoad

    视图加载完成之后被调用

    5. -(void)viewWillAppear:(BOOL)animated view将要显示的时候,可

    6. -(void)viewDidAppear:(BOOL)animatedview已经显示的时候;

    7 -(void)viewWillDisappear:(BOOL)animatedview 将要隐藏的时候,

    8. -(void)viewDidAppear:(BOOL)animatedview 已经隐藏的时候;

    七、TCP连接的三次握手

    1、主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段,

    主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我.

    2、 主机B收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪佧序列号作为起始数据段来回应我

    3、主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:我已收到回复,我现在要开始传输实际数据了

    这样3次握手就完成了,主机A和主机B就可以传输数据了.

    八、HTTP协议的特点,关于HTTP请求GET和POST的区别

    GET和POST的区别:HTTP超文本传输协议,是短连接,是客户端主动发送请求,服务器做出响应,服务器响应之后,链接断开。HTTP是一个属于应用层面向对象的协议,HTTP有两类报文:请求报文和响应报文。

    HTTP请求报文:一个HTTP请求报文由请求行、请求头部、空行和请求数据4部分组成。

    HTTP响应报文:由三部分组成:状态行、消息报头、响应正文。

    GET请求:参数在地址后拼接,没有请求数据,不安全(因为所有参数都拼接在地址后面),不适合传输大量数据(长度有限制,为1024个字节)GET提交、请求的数据会附在URL之后,即把数据放置在HTTP协议头中。

    以?分割URL和传输数据,多个参数用&连接。

    POST请求:参数在请求数据区放着,相对GET请求更安全,并且数据大小没有限制。把提交的数据放置在HTTP包的包体中.

    GET提交的数据会在地址栏显示出来,而POST提交,地址栏不会改变。

    传输数据的大小:

    GET提交时,传输数据就会受到URL长度限制,POST由于不是通过URL传值,理论上书不受限。

    安全性:

    POST的安全性要比GET的安全性高;

    通过GET提交数据,用户名和密码将明文出现在URL上,比如登陆界面有可能被浏览器缓存。

    HTTPS:安全超文本传输协议(Secure Hypertext Transfer

    Protocol),它是一个安全通信通道,基于HTTP开发,用于客户计算机和服务器之间交换信息,使用安全套结字层(SSI)进行信息交换,即HTTP的安全版。

    九、对沙盒的理解

    每个iOS应用都被限制在“沙盒”中,沙盒相当于一个加了仅主人可见权限的文件夹,及时在应用程序安装过程中,系统为每个单独的应用程序生成它的主目录和一些关键的子目录。苹果对沙盒有几条限制:

    1.应用程序在自己的沙盒中运作,但是不能访问任何其他应用程序的沙盒;

    2.应用之间不能共享数据,沙盒里的文件不能被复制到其他应用程序的文件夹中,也不能把其他应用文件夹复制到沙盒中;

    3.苹果禁止任何读写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中;

    4.沙盒目录里有三个文件夹:Documents——存储;应用程序的数据文件,存储用户数据或其他定期备份的信息;Library下有两个文件夹,Caches存储应用程序再次启动所需的信息,

    Preferences包含应用程序的偏好设置文件,不可在这更改偏好设置;temp存放临时文件即应用程序再次启动不需要的文件。

    获取沙盒根目录的方法,有几种方法:用NSHomeDirectory获取。

    获取Document路径:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).

    相关文章

      网友评论

      本文标题:iOS开发学习笔记 -tableView优化/内存管理等

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