Comments

本文由 Migrant 翻译自 DTrace,感谢 onevcat 校对,转载请注明出处。本文亦被收录于 objc中国

很少有人听过 DTrace,它是隐藏在 OS 中的小宝藏。DTrace 是强大的 debug 工具 – 因为它拥有极其灵活的特性,并且因为与其它工具差异很大而可能相对不那么有名。

许多时候你的 app 的真正的用户或测试人员会看到一些意外的行为。DTrace 可以让你无需重启 app 就能够在生产版本上回答关于 app 的任何问题。

Read on →
Comments

本文由 Migrant 翻译自 Metal,感谢 onevcat 校对,转载请注明出处。本文亦被收录于 objc中国

Mental 框架支持 GPU 加速高级 3D 图像渲染,以及数据并行计算工作。Mental 提供了先进合理的 API,它不仅为图形的组织、处理和呈现,也为计算命令以及为这些命令相关的数据和资源的管理,提供了细粒度和底层的控制。Mental 的主要目的是最小化 GPU 工作时 CPU 所要的消耗。

Metal Programming Guide

Mental 是针对 iPhone 和 iPad 中 GPU 编程的高度优化的框架。其名字来源是因为 Metal 是 iOS 平台中最底层的图形框架 (意指 “最接近硬件”)。

该框架被设计用来实现两个目标: 3D 图形渲染和并行计算。这两者有很多共同点。它们都在数量庞大的数据上并行运行特殊的代码,并可以在 GPU. 上执行。

Read on →
Comments

本文由 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

iOS Custom URL Scheme

点击左边剪头打开列表,可以看到 Item 0,一个字典实体。展开 Item 0,可以看到 URL Identifier,一个字符串对象。该字符串是你自定义的 URL scheme 的名字。建议采用反转域名的方法保证该名字的唯一性,比如 com.yourCompany.yourApp

urlScheme2a

点击 Item 0 新增一行,从下拉列表中选择 URL Schemes,敲击键盘回车键完成插入。

iOS Custom URL Scheme

注意 URL Schemes 是一个数组,允许应用定义多个 URL schemes。

iOS Custom URL Scheme

展开该数据并点击 Item 0。你将在这里定义自定义 URL scheme 的名字。只需要名字,不要在后面追加 :// — 比如,如果你输入 iOSDevApp,你的自定义 url 就是 iOSDevApp://

iOS Custom URL Scheme

此时,整个定义如下图:

iOS Custom URL Scheme

虽然我赞同 Xcode 使用描述性的名字的目的,不过看到创建的实际的 key 也是非常有用的。这里有一个方便的技巧,右键点击 plist 并选择 Show Raw Keys/Values,就能看到以下效果:

iOS Custom URL Scheme

还有另一种有用的输出格式,XML,因为可以非常容易的看到字典和原始数组及其包括的实体的结构。点击 plist 并选择 Open As – Source Code:

iPhone Custom URL Scheme

Read on →
Comments

本文由 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 →
Comments

本文由 Migrant 翻译自 Mastering the iCloud Document Store,转载请注明出处。

即便在推出 3 年后,iCloud 文档存储依然是一个充满神秘、误解和抱怨的话题。iCloud 同步经常被批评不可靠且速度慢。虽然在 iCloud 的早期有一些严重的 bug,开发者们还是不得不学习有关文件同步的课程。文件同步事关重大,为应用开发带来了新方向 — 一个经常被低估的方向,比如进行同步服务相关的合作时,对于处理文件异步更改的需要。

本文会介绍几个创建支持 iCloud 的应用时可能会遇到的一些绊脚石。因为本文只会给出一些粗略的概述,所以如果你对 iCloud 文档存储还不熟悉,我们强烈建议你先阅读 Apple iCloud companion guide

Read on →
Comments

本文由 Migrant 翻译自 Custom Controls,转载请注明出处。

本文将讨论一些自定义视图和控件的诀窍和技巧。我们先对UIKit已经提供给我们的控件做一个概览,介绍一些渲染技巧。随后我们会深入到视图和它们的所有者之间的通信策略,并简略探讨辅助功能,本地化和测试。

Read on →
Comments

本文由 Migrant 翻译自 Correct Way of Defining Constants in Objective-C,转载请注明出处。

本文只是一个关于如何在Cocoa代码中定义常量的书签贴,答案来自于stackoverflow.com的这个问题。这里为那些懒人提供了一些简短的介绍和帖子本身。你可能读遍了苹果开发者文档,知道一些特定的方法参数只能接受定义为常量的枚举值列表。比如事件类型标记(NSKeyUpMaskNSKeyDownMask,等等),persistent store coordinator的存储类型(NSSQLiteStoreTypeNSBinaryStoreTypeNSInMemoryStoreType),当然还有很多其他的。所有的这些归结为几行代码。实际上定义常量的时候代码行数是你想要的常量的两倍。步骤为:首先,创建Constants.hConstants.m文件用来存放我们的常量。在Constants.h中,指定常量名字,将常量声明为一个指向NSString对象的指针:

1
2
3
// Constants.h
extern NSString * const MyOwnConstant;
extern NSString * const YetAnotherConstant;

最后,在Constants.m中通过赋值定义常量:

1
2
3
// Constants.m
NSString * const MyOwnConstant = @"myOwnConstant";
NSString * const  YetAnotherConstant = @"yetAnotherConstant";

现在你所需要做的只是引入Constants.h文件到你工程的预编译头文件。如果你有点小聪明,可能脑中会有两个问题。第一个问题或许是:在能够使用#define的情况下为什么要使用这种方法?这是个非常有意义的问题。答案很简单(但是在读到这个答案之前还不是很明显) — 使用这种方法你可以进行指针比较(@"myString" == MyConstant)而不是字符串比较([@"myString" isEqualToString:MyConstant])。前者非常非常快。第二个问题应该是为什么应该完全使用常量。又一个有意义的问题。你可以在每个使用常量的地方使用常量对应的值。但是有两个”但是”。第一,始终有人的因素。你很容易输入错字符串,而编译器并不会抱怨你的语法。但如果使用常量,它就会在你输入错常量名称的时候给予你警告。还有(第二个”但是”),XCode会尽最大努力的帮助我们自动完成代码,这些常量也不例外,因此方法会变得非常方便。Happy coding!

Comments

本文由 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 →
Comments

本文由 Migrant 翻译自 Understanding Frame,转载请注明出处。

Frame是布局的核心。每个开发者都使用frame定位和改变UIViewCALayer的大小。在本文中我将把焦点集中在CALayer上,因为它是UIView的底层实现,view.frame简单的返回了view.layer.frame。此外,我不会讨论setFrame:方法。虽然看起来范围十分有限,但实际上有许多有趣的事情在平凡又古老的frame getter方法中发生。

Read on →
Comments

本文由 Migrant 翻译自 Creating a Static Library in iOS Tutorial,转载请注明出处。

如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用。

重用代码的最简单方法是简单的 拷贝/粘贴 源文件。然而,这种方法很快就会成为维护时的噩梦。因为每个应用都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步。

这就是静态库要拯救你的。一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享。

在本教程中,你将用两种方法亲手创建你自己的通用静态库。

Read on →