我进行过很多代码审查,其中有7种最常见的代码问题。
被注释掉的代码
这让我觉得你没有学会如何使用版本控制工具和标记功能。如果这些旧代码已经不再有用了,我干嘛还需要读它!?
如果它很重要,将来你可能会需要返回来查看它。那么你可以在版本控制工具中给它添加一个适当的标记,然后把它从当前代码中移除掉。
我进行过很多代码审查,其中有7种最常见的代码问题。
这让我觉得你没有学会如何使用版本控制工具和标记功能。如果这些旧代码已经不再有用了,我干嘛还需要读它!?
如果它很重要,将来你可能会需要返回来查看它。那么你可以在版本控制工具中给它添加一个适当的标记,然后把它从当前代码中移除掉。
苹果2014年03月10日发布了一个新文档,介绍了Objective-C的几个新技巧,包括:
文档名字叫《Adopting Modern Objective-C》,将它翻译成中文了,以下是正文。
已废弃(Deprecated)的API指的是那些已经过时并且在将来某个时间最终会被移除掉的方法或类。通常,苹果在引入一个更优秀的API后就会把原来的API给废弃掉。因为,新引入的API通常意味着可以更好的发挥新硬件或操作系统的性能,或者可以使用一些在构建原有API时根本还没有的语言特性(e.g. blocks)。
每当苹果添加新方法的时候,他们都会在方法声明的后面用一个很特殊的宏来标明哪些iOS版本支持它们。例如,在UIViewController中,苹果引入了一个使用block来处理回调的方法用来展示一个模态controller,它的声明是这样的:
|
注意到NS_AVAILABLE_IOS(5_0)
了吗?这就告诉我们这个方法可以在iOS5.0及以后的版本中使用。如果我们在比指定版本更老的版本中调用这个方法,就会引起崩溃。
AppDelegate就是iOS的垃圾场。
App的生命周期管理、URL处理、通知、CoreData、第三方SDK的初始化,还有那些看起来放到哪里都不合适的函数,统统都被塞到AppDelegate.m里面!
其中,application:didFinishLaunchingWithOptions:
是最拥挤的一个。
对于许多开发者来说,launchOptions参数如同Java main函数的String[]参数一样,被忽视了。然而,摆在眼前的事实是,launchOptions包含了许多关键性知识,涉及了app在iOS上的众多启动方式。
这个周,我们就谈谈这个UIKit里面最重要的方法,揭秘一下这个知之甚少的launchOptions参数。
上一篇教程中,我们已经学习了Core Animation中3D绘图的基本方法。这篇教程,我们准备深入一些,讲讲如何创建一个可交互的3D场景。我们将会创建一个类似于旋转木马的3D场景界面,用户可以通过拖拽手势来旋转界面。
可能你已经在上一篇教程中见过最终APP的样子了,但是,让我们再来看一次吧:
你可以直接下载教程的源代码。本篇教程的源代码和上一篇教程中的源代码在同一个代码仓库里面,但是我做了一些修改,为这篇教程建立了一个新的target。
本教程将向你介绍Core Animation中用于绘制3D图形的一些技术。
好消息是:我们不必直接使用OpenGL,仅用Core Animation就可以很容易实现一些3D效果。但是,“用Core Animation来制作一个复杂的3D游戏”也并不是一个好主意。
这个教程将分为两部分。第一部分,我们先简单介绍一点3D原理知识,并运用这些概念来创建一些简单的3D场景。在第二部分中,我们将使用Core Animation来制作一个类似于旋转木马的3D场景特效。
最终app的预览效果如下:(译注: 原文中这里的视频被墙,因此这里只简单的提供一个图片预览,你可以直接下载例子代码运行即可以看到最终app的效果)
准备好了吗?开始编码吧!
一些关于MVC模式的实践要点,摘自《iOS5 Programming Pushing The Limits》。
一个好的模型类仅以独立的描述性的方式封装数据。
比如一个Person类,可能有name、address、brithdate、image这些描述性的数据。但是不应该有显示或修改这些功能。
模型类应当只引用其他模型类,永远不要引用视图(View)类或控制器(Controller)类
模型类可以定义一个协议,用delegate的形式和它们交互,这样就不需要引用一个特定类型的视图类或者控制器类了。
Objective-C的Category(类别)是一个很强大的特性。使用Category我们可以给现有类增加一些新的方法。但是也仅限于方法,不能直接增加新的property。但通过运行时中的objc_setAssociatedObject
/objc_getAssociatedObject
函数,就可以很方便的为现有类增加新property。
如下面代码所示:
|
GCD还提供了许多很有用的API用于控制队列中的任务。接下来,我们挨个看看这些API,你就明白为什么GCD如此强大。
dispatch_set_target_queue
函数用于设置一个”目标”队列。这个函数主要用来为新创建的队列设置优先级。当用dispatch_queue_create
函数创建一个队列后,无论创建的是并行队列还是串行队列,队列的优先级都和全局队列的默认优先级一样。创建队列后,你可以用这个函数来修改队列的优先级。下面的代码演示了如何给一个串行队列设置background优先级。
|
Dispatch Queue,顾名思义,它是一个队列,用于存储要执行的任务。程序员可以用block语法编写要执行的任务,再通过dispatch_async
函数将它加入到一个dispatch队列中。然后dispatch队列会按照FIFO的顺序执行这些任务。如图7-1所示。
GCD中有2种dispatch队列。一种是串行队列,队列中前一个任务执行完毕后,后一个任务才开始执行。另一种是并行队列,并行队列可以同时执行多个任务。如图7-2所示。