《iOS 6 Programming Cookbook》读书笔记

来源:互联网 发布:西游之路升阶数据 编辑:程序博客网 时间:2024/06/02 14:22

新浪微博:东门兜

第 1 章 基础入门

1.6.3

当你的设备已经添加到开发者账号中了,你不能把他删除掉,除非过了一年。当过了一年之后或者你重新续费,这个时候你可以删除它们来添加新的。这样可以确保你不是没有事在那添加着玩的。

1.7.2

给你的变量一个很明确的描述,一看就知道这个变量是用来干什么的,避免使用一些简单的类似’i’或者’x’,这样让人看到很不能理解的变量名称。

1.13.3

方法分为两类:实例或类。实例方法可以被称为一个类的实例(即,对每个基于类而创建的对象),而被称为类方法得到的类本身不需要程序员再为类而创建实例。

1.14.3

方法重载:在Objective-C 中,你只需要改变至少有一个参数的名称。而更改参数的类型将无法工作。

1.20.3

Base SDK(基底SDK)
这个SDK 是用来编译应用程序。可能是最新最大的SDK,且能存取所有新的API。
Deployment SDK/Target(部署SDK)
这边的SDK 是指定你希望编译后并执行的装置SDK 版本。

1.23.3

在使用快速枚举或不可变数组的过程中,禁止向数组添加对象或许从数组删除对象,否则就会引起运行时错误。这是可变数组快速排序时的默认行为。系统会自动实现。

1.27.2

对文件包中的每个资源都独立命名。例如,在主文件包一个命名为Default.png 的文件在不止一个地方出现,这种做法不推荐。使用不同方法从一个文件包加载一种资源会导致不同结果。因此,要确保任何一个文件包中的文件能够区别命名,不论是在主文件包或自己创建的自定义文件包。

第2 章 使用视图控制器和视图

1.0

所有的iOS 应用程序基本都使用Model-View-Controller,或称为MVC 架构。从架构角度来看,Model,view 和controller 是一个iOS 应用程序的3 个主要组件。

Model 是应用程序的核心。它负责计算和创建一个虚拟的世界,即使没有view 和controller 也可以进行。可以这样理解,model 就是你的应用程序的一份虚拟拷贝——没有外观!

view 则是用户与你的程序进行交互的窗口。大部分情况下,View 都用来显示Model 提供的数据,除此之外也负责处理与用户的互动。用户都是透过View 与应用程序间的互动,而Controller 则负责捕捉互动的讯息并传送给Model。

在iOS 编程中,Controller 通常是指view controller。可以把view controller 想象成一座Model 跟View 之间的桥梁。他负责说明一边发生了什么(用户处于view 这边,而信息是有model 提供的),以及用相关的信息告诉另外一边。

1.8.3

segmentedControlStyle属性在iOS 7中被废弃了。

1.14.3

每个视图控制器的导航项目可以显示它的一个标题,这个标题可以指定两种不同方式显示:
• 简单文本
• 一个view
如果你想使用文本,可以使用导航项目的title 属性。然而,如果要更多控制标题或者要在导航栏简单显示图片或者其他视图,可以使用视图控制器的导航项目中titleView 属性。可以对其赋值任意UIView 的子类对象。

第5 章 Storyboards

1.2.3

在storyboard 画布的空白处进行双击,你会看到内容会缩小。

第6 章 并发

1.0

当两个或两个以上的任务同时执行时就发生了并发。即使只有一个CPU,现代操作系统也能够在同时执行多个任务。要实现这一点,它们需要给每个任务从CPU 中分配一定的时间片。例如,要在1 秒钟内执行10 个同样优先级的任务,操作系统会用10(任务)来平均分配1000 毫秒(每秒钟有1000 毫秒),那么每个任务就会有100 毫秒的CPU 时间。这就意味着所以的任务会在同一秒钟内执行,也就是并发执行。
然而,随着技术进步,现在我们的CPU 有不止一个内核。这就意味着CPU 真正具备了同时执行多个任务的能力。操作系统将任务分配到CPU 并等到任务执行完成。就是这么简单!

block 对象与普通的函数最大的区别可能就是拷贝本地变量的值,然后在block 对象内部进行访问,并会保存这份拷贝,以供局部访问。如果这些变量在block 对象外修改了,那么block 对象仍然会保存它自己拷贝的那一份。

一个APP 的主线程是处理UI 事件的线程。如果你在主线程执行一个长时间运行的任务,就要注意APP 的UI 会没有响应或者响应缓慢。为了避免这一点,你可以创建一个独立线程和/或计时器,它们会分别执行各自的任务(即使是一个长时间运行的任务)同时又不会阻塞主线程。

1.5.3.

dispatch_sync 方法不能在主队列中调用,因为这回无限期的阻止线程并会导致你的应用死锁。所有通过GCD 提交到主队列的任务必须是异步的。

1.6.3.

如果你同步提交一个任务到一个并发队列,同时提交另一个同步任务到另一个并发队列;相对而言这两个同步任务将异步运行,因为他们运行在两个不同的并发队列上。理解这一点很重要,正如我们将看到的那样,你想确定在B 任务开始之前A 任务完成了。为了保证这一点,把它们同时提交一个相同的队列。

1.11.3.

我们将使用dispatch_queue_create 函数创建串行队列。这个函数的第一个参数是C 字符串(char *),它将唯一标识系统中的串行队列。我强调系统的原因是这个标识符是一个全系统标识符,意味着你的APP 创建了一个新的带有serialQueue1 标识符的串行队列,和别人的APP 的标识符相同,GCD 无法确定创建一个新的有相同命名的串行队列的结果。因为这一点,Apple 强烈推荐你使用反向DNS 格式的标识符,反向DNS 标识符通常按照这样的方法构建:com.COMPANY.PRODUCT.IDENTIFIER。

1.12.3.

Main 线程是程序处理触摸事件和用户输入的地方。为了确保程序总是能对用户的操作做出响应,你应该永远都不要使用main 线程执行long-running 任务,或者执行一个潜在的无限运行的任务,例如网络的访问。而是应该总是把这类任务移到后台线程中。具体执行方法是把每一个任务封装到operation 对象中,并将其添加到一个operation 队列中,当然,你也可以自己创建一个确定的线程。

第9 章 使用视图控制器和视图

1.1.3.

NSURLConnection 提供了两种方式来实现连接,一种是同步的另一种是异步的,异步的连接将会创建一个新的线程,这个线程将会来负责下载的动作。而对于同步连接,在下载连接和处理通讯时,则会阻塞当前调用线程。
许多开发者都会认为同步的连接将会堵塞主线程,其实这种观点是错误的。一个同步的连接是会阻塞调用它的线程。如果你在主线程中创建一个同步连接,没错,主线程会阻塞。但是如果你并不是从主线程开启的一个同步的连接,它将会类似异步的连接一样。因此这种情况并不会堵塞你的主线程。事实上,同步和异步的主要区别就是运行runtime 为会异步连接创建一个线程,而同步连接则不会。

第12 章 文件和文件夹管理

1.1.1.

程序开发人员应该使用IOS SDK 暴露出来的API 来获取文件夹及/或文件的路径.换句话说,你不应该假设一个文件夹或文件的路径.而是应该确保使用合适的API 来做这件事情,例如,你正在查找 Documents 文件夹的路径,但你绝不要在你的资源束(bundle)中假设此Documents 的调用路径,而是简单的使用合适的API 来获得路径,另外,如果你想添加或存取此文件夹中的文件,只需要把文件名添加到此路径的后面.

第14 章 多任务

1.0.

多任务允许“后台执行”(background execution),意味着程序可以像往常一样工作—运行任务,产生大量的新线程,等候通知并对事件作出反应—但不会在屏幕上显示任何东西或者以任何方式和用户交互。当用户按下设备上的Home 按钮,这在之前的版本将终止iPhone或者iPad 上的应用程序,现在程序会被送到后台。

在支持多任务的iOS 版本上运行的应用程序默认选择在后台执行。如果你将程序更新到iOS SDK 4.0 及后续版本,你可以选择不在后台执行,如你在14.10 小节所见。如果你这样做,你的程序将在用户按下Home 按钮时退出,像以前一样。

当我们的程序转到后台(比如用户按下了Home 按钮)然后回到前台(当用户再次选择程序时),系统会发送一些不同的消息,期待被我们指派的应用程序委托对象接收。比如,当我们的程序被送到后台,应用程序委托将会收到applicationDidEnterBackground: 方法,当程序被用户切到前台,应用程序委托将收到applicationWillEnterForeground:委托消息。

除了这些委托消息,在程序前后台切换时,iOS 也向运行中的程序发送通知。程序转入后台时发送的通知是UIApplicationDidEnterBackgroundNotification,从后台切回前台发送的通知为UIApplicationWillEnterForegroundNotification。你可以使用默认通知中心来注册这些通知。

1.2.3.

当一个iOS 应用被送到后台,它的主线程会被暂停。你用NSThread 的detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了。如果你想在后台完成一个长期任务,就必须调UIApplication 的beginBackgroundTaskWithExpirationHandler:实例方法,来向iOS 借点时间。UIApplication 的backgroundTimeRemaining 属性包含了程序完成他的任务可以使用的秒数。如果在这个期限内,长期任务没有被完成,iOS 将终止程序。每个对beginBackgroundTaskWithExpirationHandler:方法的调用,必须要相应的调用endBackgroundTask:方法(UIApplication 的另一个实例方法)。也就是说,如果你向iOS 要更多时间来完成一个任务,你必须告诉iOS 你什么时候能完成那个任务,那时,你的程序将和其所有被暂停的线程被放入后台。

1.6.3.

让我们用一个例子展示如何保存程序的状态。假设我们在为iOS 编写一个游戏。当我们的游戏被送到后台,我们想:
1.将游戏引擎置为暂停状态。
2.将用户的分数保存到磁盘。
3.保存当前关卡的数据到磁盘。这包括用户在关卡中的位置,关卡的物理参数,照相机,位置,等等。

当用户重新打开程序,将程序带回前台,我们想:
1.从磁盘加载用户的分数。
2.从磁盘加载上次用户在玩的关卡。
3.恢复游戏引擎。

1.8.3.

通知可以被合并然后一起发给唤醒中的程序。让我解释一下什么叫做“合并”吧。假设你的程序在前台,而你已经注册了UIDeviceOrientationDidChangeNotification 通知。现在,你的用户按下了Home按钮,你的程序被送到后台。然后用户旋转设备从竖屏,到横屏(右),然后到竖屏,然后到横屏(左)。当用户将你的程序带回到前台后,你只会收到一个UIDeviceOrientationDidChangeNotification 类型的通知,这叫做合并。所有其他在程序被打开之前发生的横竖屏变化都不重要(因为你的程序不在屏幕上),系统不会将他们发给你的程序。但是,系统将为系统的每个方面向你至少发送一个通知,比如方向变化,然后你可以检测到设备最近一次方向变化。

第17 章 图形和动画

1.0.

Apple 为开发者提供了强有力的框架,来处理iOS 和OS X 中的图形和动画。下面是这些框架和技术:
UIKit
高级别框架,允许程序员创建视图,窗口,按钮,和其他UI 相关的控件。它也将低层的API 组合到一个易于使用的高级别API 中。
Quartz 2D
运行内部的用于iOS 画图的主引擎;UIKit 使用了Quarz。
Core Graphics
支持图形环境(后面会介绍),加载图片,绘制图片等等的框架。
Core Animation
顾名思义,iOS 上的动画框架。

在iOS 设备上屏幕的原点在左上角。以左上角为绘制原点的屏幕也被称为Upper Left Origin 屏,或者ULO 屏。这意味着(0,0)点位于屏幕的最左和最上边的位置。并且x 轴从这点向右为正向,y 轴向下为正向。也就是说x 轴的20 比10 要更靠右一些。y轴上,20 比10 要更靠下一些。

1.9.3.

drawRect:方法首先调用了drawRectAtTopOfScreen 方法,此后,调用drawRectAtBottomOfScreen 方法。我们drawRectAtBottomOfScreen 中没有要求一个阴影,但是如果你跑一下程序,你马上观察到屏幕下方的第二个矩形被应用了阴影效果。为了避免这个,我们将在对图形环境应用阴影效果之前保存它的状态,并在我们想去掉阴影效果时,恢复之前的状态。
广而言之,图形环境状态的存取不仅限于阴影。恢复图形环境的状态会恢复一切(填充色,字体,线宽,等等)到你之前的设置。所以如果你同时也设置了填充和画笔颜色,这些颜色也会被重置。
你可以通过CGContextSaveGState 过程来保存图形环境的状态, 而通过CGContextRestoreGState 过程恢复之前的状态。所以如果修改drawRectAtTopOfScreen 过程,在应用阴影前保存图形环境状态,并在绘制路径后恢复其状态,我们将得到不同的结果。

0 0
原创粉丝点击