一、关键词 extern:C语言的函数外部声明。

如果你要在一个.c或者.m中使用另外一个.c文件的函数的话,需要在文件中写入目标函数的外部引用的声明。

二、自定义View

自定义View添加控件对象要在写在loadView里面,不要写在viewDidLoad里面。这样能提高性能。因为程序在调用loadView之后会调用viewDidLoad。

三、几个最可能被忽略的内存泄露的地方

1、主线程block循环引用。导致UIView无法释放,内存泄露。

第一种情况:外部强引用block,block强引用外部成员

举个例子:比如一个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。

第一种情况的例子如下图:

解决方法一:不让外部self的pTest指针强引用Person对象,如下图:

解决方法二:定义一个弱指针sel指向self,然后block在强引用一个弱指针对象的成员变量时不会发生循环引用,如下图:

第二种情况:堆内部对象强引用block,block内部强引用对象的成员变量,导致相互引用,内存泄露。如下图:

解决方法:定义一个弱指针pp指向p,这样block内部强引用弱指针对象的成员变量不会发生循环引用。如下图:

延伸: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决定线程的执行顺序。

即使是设定了最大NSOperationQueue线程数是1,但实际执行的时候不一定就只是开了一个子线程。因为当一个子线程已完成,但未从内存中销毁时,就会马上新建一个线程,所以,可能存在大于1个数目的线程。但通过addDependency可以实现只会开一个子线程,顺序执行,即GCD的串行队列异步执行。但NSOperation可操作项要多。

3、GCD:是基于C语言的底层API。

优点:用block定义任务,可以很方便的管理全局队列、串行队列和并发队列以及同步执行和异步执行任务。

注意:主线程栈区1M,子线程栈区每个512K。

GCD延伸:

1、全局队列

dispatch_queue_t q =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

注意:开发中尽量使用DISPATCH_QUEUE_PRIORITY_DEFAULT。因为可能会产生多线程优先级反转,即低优先级线程阻塞高优先级线程。

全局队列本质上等同于并发队列。

2、主线程队列

dispatch_queue_t q = dispatch_get_main_queue();

主线程队列本质上是串行队列。

串行队列可能会发生阻塞。

看下面两个例子:

①主线程队列阻塞

如果当前线程已经是主线程,则会阻塞。如果是其他线程需要更新UI的时候这样调用则不会阻塞。

dispatch_queue_t q = dispatch_get_main_queue();

// 阻塞了!!!

dispatch_sync(q, ^{

NSLog(@"come here baby!");

});

②串行队列阻塞

dispatch_queue_t q = dispatch_queue_create("andy.1", DISPATCH_QUEUE_SERIAL);

for (int i = 0; i < 10; i++)

{

dispatch_async(q, ^{

NSLog(@"%@---%d", [NSThread currentThread], i);

//这里已经死锁了,只有串行队列这么写才会死锁

dispatch_sync(q, ^{

NSLog(@"%@ -- 哈哈", [NSThread currentThread]);

});

});

}

三种方式跳跃到主线程更新UI:

六、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动画从后台返回后会自动停止。

注意:上面三种情况只发生在CABasicAnimation、CAKeyFrameAnimation和CATransition中。CATransform3D改变的是实际的frame。为什么?因为CATransform3D不是动画啊。layer的隐式属性之所以可以使用CATransform3D做出动画的样子是CATranscation默认[CATransaction setDisableActions:YES];。如果为NO,照样没有动画。一定要注意CGAffineTransformMakeTranslation、CATransaction和CATransition的用处。

七、互斥锁(@synchronized)和原子锁(atomic)

1、互斥锁(@synchronized)用在多线程中,能够在保证在同一时刻该对象只被一个线程访问。保证数据的正确性。

缺点:互斥锁非常的消耗性能。非常不建议使用。

2、原子锁(atomic)是128位自旋锁。性能比较高。可以在@property声明一个变量或者oc对象指针的时候使用。

八、单例的实现。

使用GCD实现。

在iOS中,所有对象的内存空间的分配,最终都会调用allocWithZone方法。

九、自定义delegate支持storyboard拖线链接。

需要在定义delegate的时候加上IBOutlet。例如:@property (nonatomic, weak) IBOutlet id<AndyLockViewDelegate> delegate;

十、自定义按钮

1、如果要自定义按钮,使用的是selected属性,一个是设置UIButtonTypeCustom,一个是重写setHighlighted:方法。

2、如果是xib或者storyboard想搞出自定义的效果,首先设置Type为Cunstom,这样可以防止按钮文字默认为蓝色,也能防止按钮处于HighLighted按钮变灰透明。需要设置StateConfig的Default状态的Background图片HighLighted的Background图片

iOS 通览(二)的更多相关文章

  1. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

  2. iOS 原生二维码扫描和生成

    代码地址如下:http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描工 ...

  3. iOS - QRCode 二维码

    1.QRCode 在 iOS7 以前,在 iOS 中实现二维码和条形码扫描,我们所知的有,两大开源组件 ZBar 与 ZXing. 这两大组件我们都有用过,这里总结下各自的缺点: 1.ZBar 在扫描 ...

  4. iOS 7 二维码

    维码扫描 2014-06-13 10:20:29|  分类: iOS|举报|字号 订阅     下载LOFTER客户端     // //  TCTosweepScan.m //  TongCheng ...

  5. Use GraceNote SDK in iOS(二)获取音乐的完整信息

    在需求彻底明朗化,外加从MusicFans转到GraceNote,再从GraceNote的GNSDK转到iOS SDK后,最终完毕了在iOS上通过音乐的部分信息获取完整信息的功能了.(好吧,我承认是相 ...

  6. IOS开发 二维码功能的实现

    原帖地址:http://yul100887.blog.163.com/blog/static/20033613520121020611299/ 如今二维码随处可见,无论是实物商品还是各种礼券都少不了二 ...

  7. AJ学IOS 之二维码学习,快速打开相机读取二维码

    AJ分享,必须精品 上一篇文章写了怎么生成二维码,这儿就说说怎么读取吧,反正也很简单,iOS封装的太强大了 步骤呢就是这样: 读取二维码需要导入AVFoundation框架#import <AV ...

  8. AJ学IOS 之二维码学习,快速生成二维码

    AJ分享,必须精品 二维码是一项项目中可能会用到的,iOS打开相机索取二维码的速度可不是Android能比的...(Android扫描二维码要来回来回晃...) 简单不多说,如何把一段资料(网址呀,字 ...

  9. iOS 生成二维码

    首先先下载生成二维码的支持文件 libqrencode 添加依赖库 CoreGraphics.framework. QuartzCore.framework.AVFoundation.framewor ...

随机推荐

  1. coherence初识

    近期,发现在预发布环境上的项目有些冲突,本着治病救人的原则,不得已要一步步剖析,苦逼的就是我们可爱可敬的程序员. 先介绍下大体情况,应用项目都是velocity+spring+mybatis,没什么好 ...

  2. 关于HashMap根据Value获取Key

    关于我对java中集合的总结有如下三篇: 关于JDK中的集合总结(一) 关于JDK中的集合总结(二) 关于JDK中的集合总结(三) 关于数组集合之间的转换 Map中是一个key有且只有一个value. ...

  3. poj 3565 二分图最优匹配

    思路: 将ant与tree之间用距离来做权值,求最小权匹配就可以了.可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小. 就像斜边永远比直角边长一样的道理. # ...

  4. poj 1679 次小生成树

    次小生成树的求法: 1.Prime法 定义一个二维数组F[i][j]表示点i到点j在最小生成树中的路径上的最大权值.有个知识就是将一条不在最小生成树中的边Edge加入最小生成树时,树中要去掉的边就是E ...

  5. CF 13E. Holes 分块数组

    题目:点这 跟这题BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊  一模一样 分析: 分块数组入门题. 具体的可以学习这篇博文以及做国家集训队2008 - 苏煜<对块状链表的一 ...

  6. 前端开发中的一些chrome插件推荐

    这篇博客推荐的都是谷歌chrome浏览器插件,理论上,与之相同内核的浏览器都能使用.由于是谷歌插件,所以在天朝的网络,你懂的! 红杏 专为 学者 .程序员.外贸工作者 打造的上网加速器.我们相信,上网 ...

  7. Linux - 文件的压缩与归档

    文件压缩 常用的压缩命令有 gzip.bzip2 等. gzip 命令 命令格式 gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ...  ] 命令参数 -c ...

  8. Git CMD - mv: Move or rename a file, a directory, or a symlink

    命令格式 git mv [-v] [-f] [-n] [-k] <source> <destination> git mv [-v] [-f] [-n] [-k] <so ...

  9. javascript应用:页面解析list和map封装后的json数据

    开发web项目时,经常会使用到的页面脚本语言javascript,使用它能让页面展示上的效果更多彩. 今天就来说一下,从数据库中获取到数据后在页面上的展示方式: 1.数据库取出数据放入list< ...

  10. Sqlserver 关于游标

    对于sql来说查询的思维方式的面向集合对于游标来说:思维方式是面向行的 性能上:游标会吃更多内存,减少可见的并发,锁定资源等 当穷尽了while循环,临时表,表变量,自建函数,或其他方式仍然无法实现某 ...