Metal
本文由 Migrant 翻译自 Metal,感谢 onevcat 校对,转载请注明出处。本文亦被收录于 objc中国。
Mental 框架支持 GPU 加速高级 3D 图像渲染,以及数据并行计算工作。Mental 提供了先进合理的 API,它不仅为图形的组织、处理和呈现,也为计算命令以及为这些命令相关的数据和资源的管理,提供了细粒度和底层的控制。Mental 的主要目的是最小化 GPU 工作时 CPU 所要的消耗。
Mental 是针对 iPhone 和 iPad 中 GPU 编程的高度优化的框架。其名字来源是因为 Metal 是 iOS 平台中最底层的图形框架 (意指 “最接近硬件”)。
该框架被设计用来实现两个目标: 3D 图形渲染和并行计算。这两者有很多共同点。它们都在数量庞大的数据上并行运行特殊的代码,并可以在 GPU. 上执行。
Read on →自定义 URL Scheme 完全指南
本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处。
注意: 自从自定义 URL 的引入,本文始终是我博客中阅读量最大的文章。虽然大多数都相同,但仍然有一些细微差别的变化。本文是原帖的重写版,更新为最新的 iOS 和 Xcode 版本。
iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用。
注册自定义 URL Scheme
注册自定义 URL Scheme 的第一步是创建 URL Scheme — 在 Xcode Project Navigator 中找到并点击工程 info.plist 文件。当该文件显示在右边窗口,在列表上点击鼠标右键,选择 Add Row:
向下滚动弹出的列表并选择 URL types。
点击左边剪头打开列表,可以看到 Item 0,一个字典实体。展开 Item 0,可以看到 URL Identifier,一个字符串对象。该字符串是你自定义的 URL scheme 的名字。建议采用反转域名的方法保证该名字的唯一性,比如 com.yourCompany.yourApp。
点击 Item 0 新增一行,从下拉列表中选择 URL Schemes,敲击键盘回车键完成插入。
注意 URL Schemes 是一个数组,允许应用定义多个 URL schemes。
展开该数据并点击 Item 0。你将在这里定义自定义 URL scheme 的名字。只需要名字,不要在后面追加 :// — 比如,如果你输入 iOSDevApp,你的自定义 url 就是 iOSDevApp://
此时,整个定义如下图:
虽然我赞同 Xcode 使用描述性的名字的目的,不过看到创建的实际的 key 也是非常有用的。这里有一个方便的技巧,右键点击 plist 并选择 Show Raw Keys/Values,就能看到以下效果:
还有另一种有用的输出格式,XML,因为可以非常容易的看到字典和原始数组及其包括的实体的结构。点击 plist 并选择 Open As – Source Code:
iBeacon 来了
本文由 Migrant 翻译自 Can you Smell the iBeacon?,转载请注明出处。
虽然我们还未看到任何实际生活中的使用案例,但 iBeacon 绝对是 iOS 7 带来的最热门的新话题之一。
上周我收到了我的 Developer Preview Kit from Estimote,为了将其收入我正在写作的新书中,我开始研究 iBeacon。下面是我的发现。
为了理解两种操作模式的不同之处,有两个词你应该知道:
- Monitoring – 涉及小功率区域监测,接收 didEnterRegion: 和 didExitRegion: 代理消息。
- Ranging – 意味着大功率活动,此时你能从各个 iBeacon 收到信号强度并能够估计此刻与它们的距离。
iOS 7 之前苹果给我们提供了监测设备将要进入或离开某一个特定区域的能力,其核心是 CLRegion
。该技术围绕着地理位置和进入或退出该位置时将要发生的事情。更好的是,如果你在 info.plist 中指定了接收后台位置更新,那么系统可以在区域边界处激活你的应用。
iOS 7 增加了继承自 CLRegion 的 CLBeaconRegion
。只要有 iBeacon 被 iOS 检测到,即使信号可能很弱,你就被定义为位于区域之内。这让测试过程令人发疯,因为即使我把我所有的 Estmote beacons 用铝箔包裹起来, iOS 仍然认为我位于该区域内。
一个 iBeacon 通过 3 个值被识别: proximityUUID, Major 和 Minor。第一个是 UUID,后两者是两个 16 位二进制整数。你可以构建 3 个级别的 CLBeaconRegion: 只有 UUID,UUID + Major,UUID + Major + Minor。例如你可能想用一个 UUID 对应整个公司,Major 对应各个店铺。Minor 则可以用来指定每个店铺中的各个货架。
Read on →精通iCloud文档存储
本文由 Migrant 翻译自 Mastering the iCloud Document Store,转载请注明出处。
即便在推出 3 年后,iCloud 文档存储依然是一个充满神秘、误解和抱怨的话题。iCloud 同步经常被批评不可靠且速度慢。虽然在 iCloud 的早期有一些严重的 bug,开发者们还是不得不学习有关文件同步的课程。文件同步事关重大,为应用开发带来了新方向 — 一个经常被低估的方向,比如进行同步服务相关的合作时,对于处理文件异步更改的需要。
本文会介绍几个创建支持 iCloud 的应用时可能会遇到的一些绊脚石。因为本文只会给出一些粗略的概述,所以如果你对 iCloud 文档存储还不熟悉,我们强烈建议你先阅读 Apple iCloud companion guide。
Read on →自定义控件
本文由 Migrant 翻译自 Custom Controls,转载请注明出处。
本文将讨论一些自定义视图和控件的诀窍和技巧。我们先对UIKit已经提供给我们的控件做一个概览,介绍一些渲染技巧。随后我们会深入到视图和它们的所有者之间的通信策略,并简略探讨辅助功能,本地化和测试。
Read on →正确定义Objective-C常量
本文由 Migrant 翻译自 Correct Way of Defining Constants in Objective-C,转载请注明出处。
本文只是一个关于如何在Cocoa代码中定义常量的书签贴,答案来自于stackoverflow.com的这个问题。这里为那些懒人提供了一些简短的介绍和帖子本身。你可能读遍了苹果开发者文档,知道一些特定的方法参数只能接受定义为常量的枚举值列表。比如事件类型标记(NSKeyUpMask
,NSKeyDownMask
,等等),persistent store coordinator的存储类型(NSSQLiteStoreType
,NSBinaryStoreType
和NSInMemoryStoreType
),当然还有很多其他的。所有的这些归结为几行代码。实际上定义常量的时候代码行数是你想要的常量的两倍。步骤为:首先,创建Constants.h
和Constants.m
文件用来存放我们的常量。在Constants.h
中,指定常量名字,将常量声明为一个指向NSString
对象的指针:
1 2 3 |
|
最后,在Constants.m
中通过赋值定义常量:
1 2 3 |
|
现在你所需要做的只是引入Constants.h
文件到你工程的预编译头文件。如果你有点小聪明,可能脑中会有两个问题。第一个问题或许是:在能够使用#define
的情况下为什么要使用这种方法?这是个非常有意义的问题。答案很简单(但是在读到这个答案之前还不是很明显) — 使用这种方法你可以进行指针比较(@"myString" == MyConstant
)而不是字符串比较([@"myString" isEqualToString:MyConstant]
)。前者非常非常快。第二个问题应该是为什么应该完全使用常量。又一个有意义的问题。你可以在每个使用常量的地方使用常量对应的值。但是有两个”但是”。第一,始终有人的因素。你很容易输入错字符串,而编译器并不会抱怨你的语法。但如果使用常量,它就会在你输入错常量名称的时候给予你警告。还有(第二个”但是”),XCode会尽最大努力的帮助我们自动完成代码,这些常量也不例外,因此方法会变得非常方便。Happy coding!
基础集合类
本文由 Migrant 翻译自 The Foundation Collection Classes,转载请注明出处。
NSArray, NSSet, NSOrderedSet 和 NSDictionary
基础集合类是每一个Mac/iOS应用的基本组成部分。在本文中,我们将对”老类”(NSArray
, NSSet
)和”新类”(NSMapTable
, NSHashTable
, NSPointerArray
)进行一个深入的研究,探索每一个的效率细节,并讨论其使用场景。
作者提示:本文包含一些参照结果,但它们并不意味着绝对精确,也没有进行多个、复杂的测试。这些结果的目的是给出一个快速和主要的运行时统计。所有的测试基于iPhone 5s,使用Xcode 5.1b1和iOS 7.1b1,64位的程序。编译选项设置为-Ofast的发布构建。Vectorize loops和unroll loops(默认设置)均设置为关闭。
Read on →理解Frame
本文由 Migrant 翻译自 Understanding Frame,转载请注明出处。
Frame是布局的核心。每个开发者都使用frame定位和改变UIView
和CALayer
的大小。在本文中我将把焦点集中在CALayer
上,因为它是UIView
的底层实现,view.frame
简单的返回了view.layer.frame
。此外,我不会讨论setFrame:
方法。虽然看起来范围十分有限,但实际上有许多有趣的事情在平凡又古老的frame
getter方法中发生。
在iOS中创建静态库
本文由 Migrant 翻译自 Creating a Static Library in iOS Tutorial,转载请注明出处。
如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用。
重用代码的最简单方法是简单的 拷贝/粘贴 源文件。然而,这种方法很快就会成为维护时的噩梦。因为每个应用都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步。
这就是静态库要拯救你的。一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享。
在本教程中,你将用两种方法亲手创建你自己的通用静态库。
Read on →