随笔分类 -  Cocoa开发

iOS,Mac开发技术
摘要:在前文《深入浅出Cocoa多线程编程之block与dispatch quene》中我介绍了 block 的一些基本语法以及如何和 GCD 结合的使用示例。block 是在 iOS 4 中引入的新特性,它和 C++ 11 中的 lamba 表达式概念相似,有时候也被称为闭包。经过一段时间的使用,我发现要用对用好 block 还是有不少需要注意的地方,今天就来八一八这些值得注意的事儿。 1,block 在实现时就会对它引用到的它所在方法中定义的栈变量进行一次只读拷贝,然后在 block 块内使用该只读拷贝。 2,非内联(inline) block 不能直接访问 self,只能通过将 self 当作参数传递到 block 中才能使用,并且此时的 self 只能通过 setter 或 getter 方法访问其属性,不能使用句点式方法。但内联 block 不受此限制。 3,使用 weak–strong dance 技术来避免循环引用。 4,block 内存管理分析 阅读全文
posted @ 2013-04-30 21:09 飘飘白云 阅读(10939) 评论(9) 推荐(3) 编辑
摘要:前文《iOS网络编程之Socket》 和《iOS网络编程之CFNetwork》 讲了最底层的 socket 和Core Foundation层的 CFNetwork,本文将介绍位于 Cocoa 中的 NSStream。NSStream 其实只是用 Objective-C 对 CFNetwork 的简单封装,它使用名为 NSStreamDelegate 的协议来实现 CFNetwork 中的回调函数的作用,同样,runloop 也与 NSStream 结合的很好。NSStream 有两个实体类:NSInputStream 和 NSOutputStream,分别对应 CFNetwork 中的 CFReadStream 和 CFWriteStream。 本文示例代码请查看: https://github.com/kesalin/iOSSnippet/tree/master/KSNetworkDemo 阅读全文
posted @ 2013-04-29 20:10 飘飘白云 阅读(6079) 评论(0) 推荐(2) 编辑
摘要:本文将介绍位于 Core Foundation 中的 CFNetwork。CFNetwork 只是对 BSD socket 的进行了轻量级的封装,但在 iOS 中使用 CFNetwork 有一个显著的好处,那就是 CFNetwork 与系统级别的设置(如:天线设置)以及 run-loop 结合得很好。每一个线程都有自己的 run-loop,因此我们可以 CFNetwork 当中事件源加入到 run-loop 中,这样就可以在线程的 run-loop 中处理网络事件了。本文示例代码就是这样做的,源码请查看: https://github.com/kesalin/iOSSnippet/tree/master/KSNetworkDemo 阅读全文
posted @ 2013-04-14 20:58 飘飘白云 阅读(13110) 评论(1) 推荐(4) 编辑
摘要:在前文《深入浅出Cocoa之Bonjour网络编程》中我介绍了如何在Mac系统下进行 Bonjour 编程,在那篇文章中也介绍过 Cocoa 中网络编程层次结构分为三层,虽然那篇演示的是 Mac 系统的例子,其实对iOS系统来说也是一样的。iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServices OS层:基于 C 的 BSD socket Cocoa层是最上层的基于 Objective-C 的 API,比如 URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的 API。Cocoa 层是基于 Core Foundation 实现的。 Core Foundation层:因为直接使用 socket 需要更多的编程工作,所以苹果对 OS 层的 socket 进行简单的封装以简化编程任务。该层提供了 CFNetwork 和 CFNetServices,其中 CFNetwork 又是基于 阅读全文
posted @ 2013-04-13 20:41 飘飘白云 阅读(26990) 评论(6) 推荐(3) 编辑
摘要:iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应相对灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象。还记得12306么,那个速度,相信大家都受不了。为了提高 iOS 的运行速度,下面我将抛砖引玉介绍一些我实践过的方法与工具,与大家分享,希望能得到更多的反馈和建议。 阅读全文
posted @ 2013-04-05 18:07 飘飘白云 阅读(4434) 评论(3) 推荐(3) 编辑
摘要:Core Plot和s7Graph都是可在iOS平台下使用的开源矢量图形库,s7Graph功能相对比较简单一些,在此就不介绍了。Core Plot 功能强大很多,我们可以利用它很方便地画出复杂的曲线图、柱状图和饼图等等。下面我先来介绍如何在项目中配置使用 Core Plot 库,然后通过一个曲线图示例来演示如何使用它,最后结合示例介绍 Core Plot 的框架结构。 阅读全文
posted @ 2013-04-04 13:25 飘飘白云 阅读(9223) 评论(5) 推荐(2) 编辑
摘要:前面写了一篇博文讲如何在 C# 中使用 ADO 访问各种数据库,在移动开发和嵌入式领域也有一个轻量级的开源关系型数据库-sqlite。它的特点是零配置(无需服务器),单磁盘文件存储数据(就像fopen一样),平台无关性,使用起来简单又高效。这些特点让其非常适合移动开发和嵌入式领域。当然,sqlite 也因其力求简单高效,也就限制了它对并发,海量数据的处理。下面,我就再接再厉,来讲讲如何在 iOS 中使用 sqlite 库和第三方封装库 FMDB,以及介绍一个 MAC 下开源的可视化 sqlite 浏览器。 本文源码:https://github.com/kesalin/iOSSnippet/tree/master/SQLiteDemo 阅读全文
posted @ 2013-03-28 23:45 飘飘白云 阅读(4183) 评论(1) 推荐(5) 编辑
摘要:Per-Vertex 与 Per-Pixel 两种光照的异同:两者都是基于相同的光照原理来进行光照计算的,Per-Vertex 光照计算是在顶点着色阶段进行,然后在光栅化阶段进行线性插值;而 Per-Pixel 光照计算是在片元着色阶段针对每一个像素进行。因此后者要比前者效果更好,看上去更加细致逼真,当然计算量自然也要多一些。 卡通效果是将漫反射因子分级,从而形成不连续的跳跃的漫反射效果。在本文中,是在片元着色阶段进行卡通效果处理的,它也可以在顶点着色阶段进行。 在这个系列的介绍中,只提及了一些简单的光照效果,还有很多更加逼真的光照算法或技巧没有涉及,比如菲涅尔效果或使用光照贴图。 阅读全文
posted @ 2013-01-11 20:52 飘飘白云 阅读(2553) 评论(6) 推荐(0) 编辑
摘要:在前文《[OpenGL ES 07-1]光照原理》中已经介绍 Opengl 中的光照原理,接下来将演示如何将这些原理用 OpenGL ES 2.0 来实现。今天的这篇文章将介绍 Per-Vertex Light 以及深度缓存,下一篇文章将介绍 Per-Pixel Light 以及卡通效果。还记得在第六篇文章的末尾留了一个小作业,用顶点缓存描绘一个立方体么 Cube?在这篇文章就会用到它。Per-Vertex Light 示例效果如下: 阅读全文
posted @ 2012-12-31 21:12 飘飘白云 阅读(2872) 评论(1) 推荐(0) 编辑
摘要:在前文《[OpenGL ES 05]相对空间变换及颜色》中讲到人的眼睛捕捉色彩的过程:在光照的作用下,物体表面反射不同频率的光子到人的眼睛中刺激感光细胞从而形成视觉。在那一篇文章中,演示了如何使用颜色,但没有提及光照,在接下来的文章中,我将来详细介绍光的特性,物体的材质属性,光照原理以及在 OpenGL ES 2.0中的应用示例。 阅读全文
posted @ 2012-12-29 21:15 飘飘白云 阅读(5000) 评论(6) 推荐(1) 编辑
摘要:在前面几篇文章里,顶点数据都是在主存中分配的内存空间,当需要进行渲染时,这些数据便通过 glDrawElements 或 glDrawArrays 从 CPU 主存中拷贝到 GPU 中去进行运算与渲染。这种做法需要频繁地在 CPU 与 GPU 之间传递数据,效率低下,因此出现了 VBO (Vertex Buffer object),即顶点缓存,它直接在 GPU 中开辟一个缓存区域来存储顶点数据,因为它是用来缓存储顶点数据,因此被称之为顶点缓存。我们只会在初始化缓冲区,以及在顶点数据有变化时才需要对该缓冲区进行写操作。使用顶点缓存能够大大较少了CPU-GPU 之间的数据拷贝开销,因此显著地提升了程序运行的效率。 阅读全文
posted @ 2012-12-20 22:32 飘飘白云 阅读(11145) 评论(2) 推荐(1) 编辑
摘要:前面已经花了两篇文章来讲 3D 变换,可 3D 变换实在不是区区两篇文章能讲的透的,为了尽量将这个话题讲得全面点,在这篇本来讲颜色的文章里再顺带讲讲相对空间变换这个还没有提及的话题。相对空间变换类似于为“本地”坐标到“世界”坐标的变换,就是坐标空间之间的变换。你可以想象下这样一个动作,抬起胳膊同时弯曲手臂,手臂相当于在胳膊的坐标空间中旋转,而胳膊所在空间又相当于在身体或胳膊的坐标空间中旋转。就好像空间是嵌套的,一层套一层,外层会影响里层,里层的变换是相对于外层进行的。此外,还将介绍如何在 OpenGL ES 中使用颜色以及背面剔除。 今天将演示这样一个相对运动与颜色的示例,示例运行效果如下图所示,源码在这里:点此查看 阅读全文
posted @ 2012-12-11 10:42 飘飘白云 阅读(3996) 评论(0) 推荐(3) 编辑
摘要:在这一篇文章中,介绍了如何通过 3D 变换来实现平移,旋转和缩放,以更好地理解前文中介绍的理论知识;同时也实现了如何通过 UIControl 来控制 OpenGL View 中的物体;此外还详细介绍了描绘图元的模式以及顶点索引模式。在文章的最后,介绍了如何使用 CADisplayLink 来实现动画效果。 阅读全文
posted @ 2012-12-07 22:10 飘飘白云 阅读(9531) 评论(0) 推荐(1) 编辑
摘要:本文详细介绍 3D 相关的一些数学知识,如矩阵变换,以及 3D 空间的物体是如何映射到屏幕上去这一整个过程:模型变换,视图变换,投影变换,视口变换。 阅读全文
posted @ 2012-12-06 19:57 飘飘白云 阅读(19095) 评论(7) 推荐(7) 编辑
摘要:在前文《[OpenGL ES 01]iOS上OpenGL ES之初体验》中我们学习了如何在 iOS 平台上设置OpenGL ES 环境,主要是设置 CAEAGLLayer 属性,创建 EAGLContext,已经创建 renderbuffer 和 framebuffer,并知道如何清屏。但实际上并没有真正描绘点什么。在本文中,我们将学习OpenGL ES 渲染管线,顶点着色器和片元着色器相关知识,然后使用可编程管线在屏幕上描绘一个简单三角形。 在 OpenGL ES 1.0 版本中,支持固定管线,而 OpenGL ES 2.0 版本不再支持固定管线,只支持可编程管线。什么是管线?什么又是固定管线和可编程管线?管线(pipeline)也称渲染管线,因为 OpenGL ES在进行渲染处理过程中会顺序执行一列操作,这一系列相关的处理阶段就被称为OpenGL ES 渲染管线。pipeline 来源于福特汽车生产车间的流水线作业,在OpenGL ES 渲染过程中也是一样,一个操作接着一个操作进行,就如流水线作业一样,这样的实现极大地提供了渲染的效率。整个渲染管线如下图所示: 阅读全文
posted @ 2012-11-25 22:35 飘飘白云 阅读(8085) 评论(0) 推荐(2) 编辑
摘要:OpenGL ES 是专门为手持设备指定的 3D 规范,它是 OpenGL 的简化版,该规范由khronos.org制定,目前最新规范版本为 3.0。 OpenGL ES 可以在不同手机系统上实现,也可以在浏览器上实现(Web GL)。在这里,我将介绍如何在 iOS 上使用 OpenGL ES,我是OpenGL ES 的初学者,错误之处难免,欢迎各位指出,共同提高。 阅读全文
posted @ 2012-11-24 23:24 飘飘白云 阅读(6641) 评论(0) 推荐(0) 编辑
摘要:KVO 并不是什么新事物,换汤不换药,它只是观察者模式在 Objective C 中的一种运用,这是 KVO 的指导思想所在。其他语言实现中也有“KVO”,如 WPF 中的 binding。而在 Objective C 中又是通过强大的 runtime 来实现自动键值观察的。本文对 KVO 的使用以及注意事项,内部实现都一一做了介绍分析,通过阅读本文可以更深入地理解 KVO。Objective 中的 KVO 虽然可以用,但却非完美,有兴趣的了解朋友请查看《KVO 的缺陷》 以及改良实现 MAKVONotificationCenter 。 阅读全文
posted @ 2012-11-17 17:24 飘飘白云 阅读(3838) 评论(3) 推荐(2) 编辑
摘要:如果我们在 Objective C 中向一个对象发送它无法处理的消息,会出现什么情况呢?根据前文《深入浅出Cocoa之消息》的介绍,我们知道发送消息是通过 objc_send(id, SEL, ...) 来实现的,它会首先在对象的类对象的 cache,method list 以及父类对象的 cache, method list 中依次查找 SEL 对应的 IMP;如果没有找到且实现了动态方法决议机制就会进行决议,如果没有实现动态方法决议机制或决议失败且实现了消息转发机制就会进入消息转发流程,否则程序 crash。也就是说如果同时提供了动态方法决议和消息转发,那么动态方法决议先于消息转发,只有当动态方法决议依然无法正确决议 selector 的实现,才会尝试进行消息转发。在前文中,我并没有详细讲解动态方法决议,因此本文将详细介绍之。 阅读全文
posted @ 2012-11-14 23:33 飘飘白云 阅读(7703) 评论(1) 推荐(2) 编辑
摘要:iOS 游戏开发教程资源,主要是 cocos2D 阅读全文
posted @ 2012-11-10 22:49 飘飘白云 阅读(1240) 评论(0) 推荐(1) 编辑
摘要:这是本人在研究 Cocoa 开发过程中写过的一些文章,涵盖 runtime,class, message,多线程,core data,网络,framework,plugin等各方面,还比较成系列,所以整理出来,贴在这里,希望对大家有帮助。文章错误之处,也希望大家指正。所有文章均遵循“署名-非商业用途-保持一致”创作公用协议。 阅读全文
posted @ 2012-02-19 09:31 飘飘白云 阅读(7566) 评论(5) 推荐(5) 编辑

本博客遵循 Creative Commons License “署名-非商业用途-保持一致”创作共用协议。 与我联系