标签:
一、关键词 extern:C语言的函数外部声明。
如果你要在一个.c或者.m中使用另外一个.c文件的函数的话,需要在文件中写入目标函数的外部引用的声明。
二、自定义View
自定义View添加控件对象要在写在loadView里面,不要写在viewDidLoad里面。这样能提高性能。因为程序在调用loadView之后会调用viewDidLoad。
三、几个最可能被忽略的内存泄露的地方
1、主线程block循环引用。导致UIView无法释放,内存泄露。
举个例子:比如一个UITableViewController,里面强引用了子空间tableView,tableView强引用其子控件UITableViewCell,在UITableViewCell的数据Item里包含了一个block可执行代码块,此时在block代码块里强引用了UITableViewController自身或其局部变量或对象,那么这个过程就产生了循环引用,造成内存泄露。
解决方法:比如引用了self,此时要这么写__unsafe_unretained typeof(self) selfVc = self;这种方法可以访问其成员变量,比如self->_age,但不能防止野指针。也可以这么写__weak typeof(self) selfVc = self;这种方法可以防止野指针,但不能访问其成员变量。(注意:所有新建一个指针指向一个对象,这个指针默认都是强指针,除非专门指定是弱指针)。
可能的陷进:既然不能直接引用self,那我用其中的成员变量总可以吧,比如说age = 10。这样一样会有内存泄露,因为age=10相当于self->_age=10,一样是强引用了self。
注意:子线程中block循环引用不会产生内存泄露。因为子线程执行完成就自动释放销毁了,那么强引用self的指针就不存在了,自然UIView也能顺利释放,就不会产生内存泄露了。
延伸:block是存在栈中还是堆中?答:有时存在栈中,有时存在堆中。
2、delagate使用了strong强指针修饰,导致循环引用,内存泄露。
举个例子:还以UITableViewCorntroller为例,UITableViewCorntroller强引用UITableView,UITableView强引用UITableViewDelegate,UITableViewDelegate的delegate强引用了UITableViewController及self,这个过程就产生了循环强引用。
解决方法:自定义delegate使用weak弱指针修饰。
3、UIView的控件都是用weak弱指针引用的,改为strong强指针可不可以?
答:可以。因为是UIview强引用控件,不是控件强引用UIView,不会产生强指针循环引用。故不会产生内存泄露。
PS:如果去一家公司面试,能够问到这种程度的话,就该珍惜一下了。
三、文字测量技术:
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context
在这个方法中只要给出文字的CGSzie,通常是最宽限定纵向自动布局或者最高限定横向自动布局,此时可以添加一些attributes比如文字字体、大小、颜色等等附加属性,执行此方法就可以返回这段文字所占用的CGSize范围尺寸大小。这个和上一篇iOS文章提到的图片平铺技术配合就可以做出QQ聊天窗口的气泡效果。
四、AnchorPoint(锚点/定位点)非常重要。
锚点/定位点:指定layer区域中哪个点位于layer.Position所处的位置。之所以重要是因为无论3D变换的CATransform3D还是2D的CGAffineTransform旋转一个控件对象都要围绕锚点旋转。比如,默认情况下旋转一个按钮,按钮是围绕其中心旋转。如果将AnchorPoint定位在按钮底部中间位置,则旋转一周就可以做出一个转盘,因此这种做法可以做出一个抽奖转盘的效果。
五、NSThread、NSOperation和GCD三种线程技术的优劣。
1、NSThread:这是iOS比较早期的多线程技术。
优点:创建和使用方便。可以通过[NSThread currentThread]跟踪任务所在线程。
缺点:不易管理。不会自动添加到自动释放池。必须手动释放,否则会产生内存泄露。
2、NSOperation:这是个抽象类,具体要使用其抽象类NSBlockOperation和NSInovationOperation。
优点:NSOperation是使用GCD实现的一套Object-C的API。是比较新的面向对象的多线程技术。提供了一些GCD中不容易实现的特性。如:可以很方便的设定开启的最大线程数,以及通过addDenpendency决定线程的执行顺序。
3、GCD:是基于C语言的底层API。
优点:用block定义任务,可以很方便的管理全局队列、串行队列和并发队列以及同步执行和异步执行任务。
注意:主线程栈区1M,子线程栈区每个512K。
六、Core Animation:
Core Animation是作用在CALayer对象layer图层上的。其所改变的图层对象是Core Graphics框架下的。因为Core Animation是跨Mac和iOS平台的,所以其操作图层的对象不能是UIKit框架下的比如UIColor对象,而是CGColor对象。
缺点:
1、Core Animation动画完成后会反弹。
2、Core Animation的动画是假象,图层的实际frame还是在原处。用在只执行动画不和用户交互的场景比较适合。否则会产生操作错位。
3、Core Animation动画从后台返回后会自动停止。
七、互斥锁(@synchronized)和原子锁(atomic)
1、互斥锁(@synchronized)用在多线程中,能够在保证在同一时刻该对象只被一个线程访问。保证数据的正确性。
缺点:互斥锁非常的消耗性能。非常不建议使用。
2、原子锁(atomic)是128位自旋锁。性能比较高。可以在@property声明一个变量或者oc对象指针的时候使用。
八、单例的实现。
使用GCD实现。
标签:
原文地址:http://www.cnblogs.com/lyandy/p/4578949.html