摘要:
每条线程都有唯一的一个RunLoop对象与之对应的 主线程的RunLoop是自动启动 子线程的RunLoop需要手动启动 子线程的RunLoop启动步骤如下: 获得RunLoop对象后要调用run方法来启动一个运行循环 // 启动RunLoop [[NSRunLoop currentRunLoop] 阅读全文
摘要:
快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以 阅读全文
摘要:
UIView显示在屏幕上归功于CALayer,通过调用drawRect方法来渲染自身的内容,调节CALayer属性可以调整UIView的外观,UIView继承自UIResponder,比起CALayer可以响应用户事件,Xcode6之后可以方便的通过视图调试功能查看图层之间的关系 UIView是iO 阅读全文
摘要:
KVO是基于runtime机制实现的 当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类(该类的子类),在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制 如果原类为Person,那么生成的派生类名为NSKVON 阅读全文
摘要:
因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本. 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性. 阅读全文
摘要:
1.对应基本数据类型默认关键字是 atomic,readwrite,assign 2.对于普通的 Objective-C 对象 atomic,readwrite,strong 阅读全文
摘要:
数组和链表都属于线性表 数组: 在内存中,数组是一块连续的区域。 数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。 通过下标读取,查找数据时效率高。 不利于扩展,数组定义的空间不够时要重新定义数组。 链表: 内存中可以存在任何地方,不要求连续。 每一个数据都保存了下一个数据的内存 阅读全文
摘要:
历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法。 但这只是在iOS5之后,苹果推出的一个新机制。看老代码时,经常看到一个大括号里面定义了成员变量,同时用了@property声明,而且还在@implementat 阅读全文
摘要:
1. dispatch_after 该函数用于任务延时执行,其中参数dispatch_time_t代表延时时长,dispatch_queue_t代表使用哪个队列。如果队列为主队列,那么任务在主线程执行,如果队列为全局队列或者自己创建的队列,那么任务在子线程执行,代码如下: dispatch_afte 阅读全文
摘要:
加入友盟统计功能后,友盟后台会有一个错误分析的统计项,点进去之后可以查看项目的错误报告。对于开发人员来说,查看报告不是最终目的,找到错误的原因才是最终目的。如何通过这堆报告定位到错误的代码呢?早上查了好些资料,终于成功了。 我们先看一下错误报告是什么样的: 友盟错误报告 友盟错误报告 这份报告所包含 阅读全文