做影视网站挣钱吗,物联网平台网站开发,xammp如何按wordpress,手机软件开发的模式在iOS中concurrency编程的框架就是GCD(Grand Central Dispatch)#xff0c; GCD的使用非常简单。它把任务分派到不同的queue队列来处理。开发者把任务代码装到一个个block里面#xff0c;操作系统把这些任务代码分派到不同的资源里去处理#xff0c;一个简单的例子来说… 在iOS中concurrency编程的框架就是GCD(Grand Central Dispatch) GCD的使用非常简单。它把任务分派到不同的queue队列来处理。开发者把任务代码装到一个个block里面操作系统把这些任务代码分派到不同的资源里去处理一个简单的例子来说为什么初学者写tableview的时候滑动列表时总会很卡因为很多初学者把图片装载放到main thread主线程去执行例如我们要滑动畅顺的话iOS最快可以1秒内刷新60次如何你的一个cell的文字和图片装载超过1/60秒的话自然就会卡。所以一般我们会把图片装载这些需要多点时间的移出main thread来处理对于用GCD来说就是把图片载入放到另外一个queue队列中来异步执行当资源准备好了后放回到main thread中显示出来。main thread在GCD中就是main queue。 创建一个新queue队列的代码 dispatch_queue_t network_queue; network_queue dispatch_queue_create(com.myapp.network, nill); 例如我们图片读取放到network_queue来进行异步执行 dispatch_async(network_queue, ^{ UIImage *cellImage [self loadMyImageFromNetwork:image_url]; // 将图片cache到本地 [self cacheImage:cellImage]; ..... } ); dispatch_async的意思就是将任务进行异步并行处理不一定需要一个任务处理完后才能处理下一个。以上代码loadMyImageFromNetwork的意思就是从网络中读取图片这个任务交给network_queue来处理。这样读取图片的时间过长也不会阻塞主线程界面的处理。 当我们处理完图片后应该更新界面从queue的概念去设计就是要将更新界面的代码放到main queue中去因为iOS里面永远是主线程来刷新重画UI。所以代码应该为 dispatch_async(network_queue, ^{ UIImage *cellImage [self loadMyImageFromNetwork:image_url]; // 将图片cache到本地 [self cacheImage:cellImage]; // 回到主线程 dispatch_async(dispatch_get_main_queue(), ^{ // 显示图片到界面 [self displayImageToTableView:cellImage]; }]; } ); dispatch_get_main_queue() 函数就是返回主线程^{} 封装的就是任务代码这样嵌套方式就可以从一个队列queue跳到另一个queue就是这么简单。 我们一般可以把networking有关的代码放到一个queue把图片resize的代码放到另外一个queue处理完后更新界面只需要嵌套跳回到 main queue。这样加上几行代码你的程序就可以利用到系统多核资源把具体的调度工作交给了操作系统自己来分配。有了这样的代码不管你的硬件是单核双核还是iMac的4核甚至8核都可以非常好地并行处理。 内存管理 我一直惊叹iOS和Objective-C内存处理能力例如iPad版本的iWorkPages应用就是一个内存处理技术应用的鬼斧神工之作。想想256M内存的iPad可以带来如此的华丽的界面同时获得如此流畅的用户体验真是不简单。原因就是iOS一直提倡开发者在有限硬件资源内写出最优化的代码使用CPU最少占用内存最小。以下代码适用于iOS SDK 4.1, 由于新SDK 4.2对内存使用有新改动所以可能有不同。。。 尽量少的UIView层 通常我们喜欢把很多控件层UILabelUIButtonUIView等一起放到一个大的UIView容器来显示我们的内容这个方法一般是可以的但是如果要经常重新刷新内容的大区域界面多数发生在iPad的应用中这个方法会带来过多的内存使用和动画的延迟比较卡例如scrollview的动画比较卡又或者经常收到内存警告。其中一个重要原因是每个控件特别是透明底的会多次重新绘制drawRect过多。其解决办法是尽量将几个控件合并到一个层上来显示这样系统会减少系统调用drawRect从而带来性能上的提升。 很简单的一个例子就是iNotes提供手写功能用户可以在iPad屏幕上写出不同的笔画开始的设计是用户每写一划iNotes就会生成一个新的透明底UIView来保持这个笔画用户写了10笔系统就生产了10个UIView每个view的大小都是整个屏幕的以便用户的undo操作。这个方案带来严重的内存问题因为系统将每个层都保持一个bitmap图一个像素需要4bit来算一个层的大小就是 4x1024x768 ~ 3M, 10个层就是 10x3M 30M很明显iPad很快爆出内存警告。 这个例子最后的方案是所有笔画都画在同一个层iNotes可以保存笔画的点进行undo操作。这样的方案就是无论用户画多少笔画界面重画需要的资源都是一样的。 显示最佳尺寸的图片 很多程序员比较懒网络上拿下来的图片直接就用UIImageView将其显示给用户这样的后果就是程序需要一直保存着大尺寸的图片到内存。解决办法应该是先将图片缩小到需要显示的尺寸释放大尺寸图片的内存然后再显示到界面给用户。 尽量使用图片pattern而不是一张大的图片 例如很多界面设计者喜欢在界面上放一个大底图但这个底图是老是占用着内存的最佳方案是设计出一个小的pattern图然后用这个方案显示成底图。 UIImage *smallImage [[UIImage alloc] initWithContentsOfFile:path]; backgroundView.backgroundColor [UIColor colorWithPatternImage:smallImage]; [smallImage release]; 使用完资源后立即释放 一般objective-c的习惯是用完的资源要立即释放因为明白什么时候用完某个资源的是程序员你自己。例如我们要读较大的图片把它缩小后显示到界面去。当大图片使用完成后应该立即释放。代码如下 UIImage *fullscreenImage [[UIImage alloc] initWithContentOfFile:path]; UIImage *smallImage [self resizeImage:fullscreenImage]; [fullscreenImage release]; imageView.image smallImage; ...... 循环中大量生成的自动释放autorelease对象可以考虑使用autorelease pool封装。代码范例 for(UIView *subview in bigView.subviews) { // 使用autorelease pool自动释放对象池 NSAutoreleasePool *pool [[NSAutoreleasePool alloc] init]; UIImageView *imageView (UIImageView *)subview; // subview处理代码 ....... // 销毁自动释放对象 [pool drain]; } 自动释放对象池把每个循环内生成的临时对象使用完后立即释放 以上的意见是本人多年来编写iPad/iPhone程序的经验另外iOS4.0的multi-tasking特性发布后程序可以被调入后台运行苹果 工程师的意见是进入后台运行时你的应用应该释放掉能释放的对象尽量保持在16M左右这样别的程序运行时才不容易把你的应用挤掉。 转载于:https://www.cnblogs.com/zsw-1993/archive/2013/03/27/4880262.html