
Mattt
Mattt (@mattt) is a writer and developer in Portland, Oregon. He is the founder of NSHipster and Flight School, and the creator of several open source libraries, including AFNetworking and Alamofire.
文章
-
Language Server Protocol
决定支持 LSP 可能是苹果自 2014 年将 Swift 作为开源软件发布以来,为 Swift 做出的最重要的决定。这对于 APP 开发者来说是一件大事,对于其他平台上的 Swift 开发者来说更是一件大事。
-
numericCast(_:)
编译通过的代码和正确的代码是不一样的。但有时候需要通过前者来最终获得后者。
-
iOS 12
在 NSHipster, 我们感兴趣的是那些最详细最细微的变化(也可以说, 晦涩的?) 但是这些细微的东西最终加起来 却又能给我们每天的工作带来很大影响的变化 为了庆祝 iOS 12 在这周的发布, 我们通过一行行的 API diff 给大家分享一些遗珠。
-
CMMotionActivity
如今的 iPhone 都有着一整套传感器,包括相机、气压计、陀螺仪、磁强计和加速规。和人类一样,它们使用不同感觉信息的组合来确定其位置和朝向,通常和我们自身的生物力学过程非常相似。
-
NSDataAsset
有很多加速网络请求的技术:压缩和流技术、缓存和预加载、连接池和多路复用、延迟和后台运行。然而,还有一种比它们优先级更高,效果更好的优化策略:压根就不发请求。
-
Swift Property Observers
现代软件开发已经被视为可能成为鲁布·戈德堡机械装置的典范。然而在进行一些远程操作时,它将显得更加清晰。
-
Hashable / Hasher
这周我们的主题是
Hashable
和相关的新类型Hasher
。它们共同组成了 Swift 最受喜爱的两个集合类Dictionary
和Set
的基础功能。 -
Never
“Never”是一个约定,表示一件事在过去或未来的任何时段都不会发生。它是时间轴上的一种逻辑上的不可能,在任何方向延展开去都没有可能。
-
密码规则 / UITextInputPasswordRules
密码应该完全没有任何意义,除非它是一个 90 年代骇客电影的标题或者一个密室逃脱游戏的答案。
-
Swift GYB
并不是所有的代码都那么光鲜亮丽,其实很多工作都是通过底层的 boilerplate 来工作的。
-
guard & defer
Swift 2.0 带来了两个新的能够简化程序和提高效率的控制流表达形式。前者可以让代码编写更流畅,后者则相反的能够让执行推迟。
-
Reader Submissions -
New Year's 2015对专业的苹果开发者来说,2014 年是一个令人难以置信的一年。随着大量新发展的出现,无论是从苹果还是整个社区,都为读者分享了很多的有趣花絮。
-
The Death of Cocoa
对于我们大多数而言,苹果的简洁、优雅和它软硬件的结合是我们为什么在这个平台开发的原因,尽管如此,即使 Swift 才开始被使用几个月,Cocoa 已经开始失去它原有的光芒了。
-
WatchKit
看过WatchKit之后,会有许多东西从UIKit里冒出来。这些主观、固执己见的东西不太好整理成文档。但是对于正在学习的人来说,可能是有趣或是有用的。
-
Swift System Version Checking
C 可以使用邪恶的预处理指令。Swift 有预处理指令的安全子集。那么,我们如何检查系统版本的 API 兼容性?
-
UIAlertController
你知道
UIAlert
、View UIAction
(以及它们各自的 delegate protocols) 在 iOS 8 中已经被废弃了吗?不骗你哦。Sheet -
Swift Comparison Protocols
Objective-C 让我们对相等性和唯一性的本质慢慢有了带有哲学色彩的思考。为了解救那些不愿意向论文一样的哲理卑身屈膝的开发者,Swift 为此作出了很多改进。
-
RawOptionSetType
Swift 的枚举类型和 Objective-C 中的
NS_ENUM
宏相比是一种显著的进步。不幸的是,NS_OPTIONS
就没有那么令人愉快了 -
Swift Default Protocol Implementations
协议是 Swift 当中泛型实现的基础,然而 Swift 中却缺少内建的提供方法默认实现的机制。不过仍然有一种办法可以解决这个问题,这个办法之前你可能没有留意到。
-
WKWebView
iOS 与 web 之间的关系非常复杂,这种复杂关系甚至可以追溯到几十年前系统建立初期。
-
Swift Literal Convertibles
上周我们探讨了如何在 Swift 中重载和创建自定义操作符,这个语言特性十分强大,同时也颇具争议。从各方面来看,本周的文章也恐将两极分化,因为它的内容是 Swift 当中一个无处不在,然而又不被人注意的特性:字面值可转换性。
-
Swift Operators
Operators in Swift are among the most interesting and indeed controversial features of this new language.
-
Alamofire
尽管我们离使用 Swift 发布 App 还有几个月的时间,已经有若干使用这门新语言的开源项目开始生根发芽了,Alamofire 便是这些项目中的一个。
-
NSCalendarUnitYear
NSHipster.com 已经走过了两个年头。每周我们都会发表一篇新文章,探讨 Objective-C 或者 Cocoa 当中一些不为人知的话题(除了几周例外)。我们用蛋糕来庆祝一下。
-
Clang Diagnostics
诊断结合了逻辑与分析来得出一个结论。这是最纯粹的科学和工程学,也是人类最有力的推理。对于我们开发者来说,我们通过代码通知后续代码的生产,创建了一个在过去半个世纪里呈几何级数发展的技术的正反馈循环。尤其对于我们的 Objective-C 开发者来说,最有效的诊断来自 Clang。
-
iOS 8
随便去问任何人,他们都会告诉你WWDC2014是近年来最为激动的回忆。这周,我们将拨开iOS 8的云雾,探讨一些所有人都应该知道新API。
-
CocoaPods
只要设计和施工得当,基础设施可以帮助社会成倍的发展。 就Objective-C而言, CocoaPods提供了一个急需的疏导和管理开源软件的工具。
-
Benchmarking
对于完成有意义的工作来说抽象很重要,但却会带来副作用。利用benchmarking,工程师可以揭开他们代码中运行效率的面纱,然后利用获得的信息来优化。
-
Configuration Profiles
iOS 作为一个平台的主要缺陷是如何锁定它。 iOS 的 Configuration Profiles 提供了一个有趣的机制来解决这些限制。
-
NSURL /
NSURLComponents在所有的一维数据类型中,URI有着至高地位。单独就人类可阅读的字符串这一点来说,它存在并将永远存在于计算机中任何你能够想象到的对位置信息进行编码的数据中。
-
Empathy
我们出于本性地想慷慨而有耐心地帮助其他人、解释一些观点。然而在网上,人性似乎没有现实中那么丰满。
-
UIReferenceLibraryViewController /
DCSDictionaryRef虽然字典的地位很大程度上已经被基于网络的“一键释义”功能所替代,但是字典和词汇表在拼写检查、语法检查、自动纠错、自动摘要、语义分析等领域,仍然在幕后扮演着重要角色。
-
NSTemporaryDirectory /
NSItemReplacementDirectory /
mktemp(3)外存被用于写入可持续化保存的数据,但当数据生命周期很短时,用Objective-C操作临时文件的资料却很少(可能有,不过这些资料本身也是“临时”的)。
-
namespacing
命名一直是Objective-C的硬伤,和那些优雅的语言相比,Objective-C缺乏标识符容器这点引来了很多不切实际的批评家。
-
Method Swizzling
Method swizzling 用来改变已存在的 selector 映射的方法实现。Method swizzling 通过在运行时修改类的消息分发列表中 selector 与实现的映射使得在运行时修改方法的调用成为可能。
-
Associated Objects
对象关联是Objective-C 2.0在运行时的新特性,这个特性允许你将任何键值在运行时关联到对象上。对象关联是黑暗符咒一样,应该和其他来自objc/runtime.h的函数一样被小心谨慎地对待
-
Extended File Attributes
在 NSA 披露的间谍活动中,在大众的关注下,元数据的概念在政府监控中担当了意想不到的角色。它是什么?它揭示了我们的什么信息和哪些日常习惯?这些是美国人民都在问的问题,他们需要一个答案。
-
NSRange
NSRange 是 Foundation 框架中核心的类型之一。在框架代码中我们经常看到它作为函数的参数或者返回值类型,因此掌握好 NSRange 这个结构会有很多用处。
-
UIApplicationDelegate launchOptions
AppDelegate 是 iOS 各种功能的集散中心。
-
NSNotification &
NSNotificationCenter思想的传播,与沟通的方式有着不可避免的联系。媒体对于信息重要性的影响是如此之大,以至于能够改变要传播的思想本身的含义。千真万确,媒体本身就是信息。
-
NSFileManager
NSFile
是处理文件系统的 Foundation 框架的高级API。它抽象了 Unix 和 Finder 的内部构成,和 iCloud ubiquitous containers 一样, 提供了创建,读取,移动,拷贝以及删除本地或者网络驱动器上的文件或者目录的方法。</wbr>Manager -
xctool
控制了构建系统,你就控制了语言,生态系统和整个社区的命运。
-
Launch Arguments &
Environment Variables有许多选项可以传递给 target 的 scheme,开启一些有用的调试特性。就像快餐店的秘密菜单一样,它们常常是隐蔽而且不为人知的。
-
Key-Value Observing
问了几次研究 NSBlock 的人员:Key-Value Observing 在 Cocoa 框架里有着最不好用的 API。它很难对付,啰嗦,令人迷惑。最糟糕的是,它的 API 掩盖了 framework 中很引人注目的特性。
-
Xcode Key Bindings & Gestures
Xcode 快捷键和手势不仅节省了宝贵的工作时间,而且能让你在工作过程中感到更自信、能力变得更强,这样的工作方式也更合理。
-
iOS 7
随着保密协议的解除,我们终于可以开始聊一聊iOS 7里面精彩的新API了。
-
AFNetworking 2.0
AFNetworking 是 iOS 和 OS X 开发中最广泛使用的开源项目之一。它十分流行,但你有没有听说过它的新版呢?
-
Network Link Conditioner
产品设计是一种感同身受。知道用户想要什么,他们喜欢什么,他们不喜欢什么,是什么原因会让他们沮丧,学习去理解并且把那些动机实现于设计 —— 这就是把一些疯狂的事情做得漂亮要去做的事情。
-
Xcode Snippets
一般搞 iOS 开发都得用到 Xcode。如果我们已经准备在开发流程中使用 IDE,那我们就应该充分利用它,不是么?所以本周的 NSHipster,我们就来聊聊 Xcode 中强大但未被充分利用的功能之一:代码块。
-
Equality
在哲学和数学领域,相等的概念一直以来都是人们所争论和探寻的焦点,其所蕴含的深层含义更是延伸到道德,社会正义以及公共政策等诸多层面。对于程序员来说,在我们所建模的问题领域当中,协调好“相等”概念在逻辑上和实际意义上的理解,是一个很重要的任务。
-
NSHashTable & NSMapTable
NSSet 和 NSDictionary,连同 NSArray 是 Foundation 框架中最常用的几个集合类型。和其它标准库不同的是,它们的实现细节没有对开发者公开,使得开发者只能编写简单的代码,相信框架(在合理的程度上)是高效的。
-
rand(3) / random(3) / arc4random(3) / et al.
所谓的随机性只是潜在的因果关系。当然,应用程序开发人员可以不关心哲学,他们关心的是代码。因此,我们本周的目标:清理所有长期以来在 Objective-C 中与随机有关的问题和误解
-
Documentation
Cocoa 开发者间流传着一句格言,Objective-C 的冗长使得其代码就是有效的自我说明。有了 longMethodNamesWithNamedParameters: 以及参数的显式类型,Objective-C 的方法不会给人留下太多的想象空间。
-
UIMenuController
移动可用性在当今是一个十分引入注目的领域,特别是考虑到在过去短短的十年时间中它所经历的巨大变革。曾经只有科技精英才能把玩的复杂技术,如今已经飞入寻常百姓家,成为了大部分人使用计算设备的主要形式。
-
NSPredicate
NSPredicate
是一个Foundation类,它指定数据被获取或者过滤的方式。它的查询语言就像SQL的WHERE
和正则表达式的交叉一样,提供了具有表现力的,自然语言界面来定义一个集合被搜寻的逻辑条件。 -
NSExpression
每当涉及查询或者整理信息时,Cocoa总是其他标准库羡慕的对象。通过使用
NSPredicate
,NSSort
,以及偶尔使用</wbr>Descriptor NSFetch
,即使是最复杂的数据任务也可以被简化成为几行_极其容易读懂_的代码。</wbr>Request -
NSFastEnumeration / NSEnumerator
遍历体现了计算能力的有趣之处。封装只执行一次的逻辑是一回事,把这个封装好的逻辑应用到集合当中的所有元素完全是另一回事了——这也正是计算机程序强大功能的一个体现。
-
NSUUID /
CFUUIDRef /
UIDevice -uniqueIdentifier /
-identifierForVendor直到最近之前,应用程序,甚至是跨应用程序启动的时候,获得设备的唯一标识一直都是小菜一碟,简单的请求 UIDevice -uniqueIdentifier 就完事了。
-
对象下标索引
Xcode 4.4悄然为Objective-C引入了语法革命。然而,像所有的革命一样,我们要费些努力才能找出它的起因和煽动者:Xcode 4.4附带有苹果LLVM编译器4.0,其中纳入了在Clang的前端版本3.1生效的改变。
-
NSDataDetector
当人类在他们所有的日常交往中都使用 RDF 后,人工智能的一大任务就是要去搞清楚到底我们都在谈论什么。幸运的是,对于 Cocoa 开发者来说,我们有 NSDataDetector。
-
单元测试
对于开发者来讲,单元测试是一个容易让人激动的话题。它会激发起其热心拥护者的优越感,唤起非从业人员的不足感。Cargo Cults like TDD这篇文章(Cargo Cults)为他们在单元测试上的名誉打上了共同选择并且道德和工具不分的标签。
-
Core Data Libraries & Utilities
上周,我们感觉Core Data有些难,所以为了NSHipster的这个问题,我们将奉上关于使用Core Data的最好开源库的引导。仔细阅读,看看你如何充分利用这次Core Data体验。
-
NSCoding / NSKeyedArchiver
在构建应用程序时,一个重要的架构决策问题是在每次启动之间如何持久化数据。问题是如何精准的重现最后一次关闭应用前的状态;如何描述对象图以使下次完美地重新构建。
-
MKLocalSearch
在喧闹纷繁的事态下,你可能完全没有发现 iOS 6.1 中的 MapKit 增加了什么。
-
NSSecureCoding
本周的简短文章:你需要了解的关于 NSSecureCoding 的一切。
-
BOOL / bool / Boolean / NSCFBoolean
再一次,将我们有逻辑的世界编码为冰冷的电脑计算字节码使得我们不得不用这样或那样的方法处理这些问题。同时,通过阅读我们关于Objective-C中布尔值及其同类的讨论,你会发现,真相实在是比小说还离奇。
-
iCloud
可能Apple最出名的地方就是它的持久化记录信息来构建web服务了。从消费者产品级的MobileMe、Ping到开发者工具级别的Provisioning Portal和iTunes Connect,苹果都在便捷性、鲁棒性、扩展性方面确立了新标准
-
Search Kit
Search Kit 是一个用人类语言来搜索和建立内容索引的 C 框架。它支持词组或部分单词匹配,包括逻辑操作和通配符,且能通过相关性对结果进行排序。Search Kit 也提供了文档总结功能,在生成有代表性的摘要时很有用。最重要的是:它是线程安全的。
-
C Storage Classes
在 C 语言中,程序中的变量或函数的作用域和生存周期是由它的存储类确定的。了解这些存储类能帮助我们解密整个 Objective-C 中都常见的术语
-
UIAppearance
UIAppearance 允许我们对视图和控件的样式在整个应用范围内进行统一的定义。
-
NSAssertionHandler
编程结合了人类思考过程中众多学科,从高层次的辩论和语义学——我们用来解释一个系统如何工作的故事——到支撑所有一切的数学和哲学机器。
-
ReactiveCocoa
打破了苹果API排他性的盾牌,本期NSHipster将介绍一个为Objective-C勇敢构建新纪元的开源项目:ReactiveCocoa
-
NSURLCache
NSURLCache 为您的应用的 URL 请求提供了内存中以及磁盘上的综合缓存机制。作为基础类库 URL 加载系统的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。
-
Type Encodings
从数字电台和数学命理到象形文字和流浪汉码,找到看似平常的东西中隐藏的意思真是令人着迷。即使它们中隐藏的信息很少用到或者并不特别有趣,但正是那种寻找的快感激发着我们强烈的好奇心。
-
NSValue
打包就是用一个面向对象的容器来封装标量及其他一些值类型的过程,主要用于将那些值保存到面向对象的集合中——如数组和字典。在基础类库中,以轻量级著称的一个包装便是 NSValue 。
-
NSLocalizedString
字符串也许是计算中最通用的数据类型。它们以符号的方式传来传去,用来为数值编码,键值关联,代表资源路径,存储语言内容和格式的信息。对面向用户的字符串具有强有力的控制是营造良好的用户体验必不可少的能力。
-
__attribute__
本站点文章经常中出现的一个主题是,强调和编译器保持良好关系的重要性。和其他手艺一样,程序员的效率也取决于如何对待他们的工具。照顾好你的工具,它们也会照顾好你。
-
nil / Nil / NULL / NSNull
理解“不存在”的概念不仅仅是一个哲学的问题,也是一个实际的问题。我们是 有形 宇宙的居民,而原因在于逻辑宇宙的存在不确定性。作为一个逻辑系统的物理体现,电脑面临一个棘手的问题,就是如何用 存在 表达 不存在 .
-
Reader Submissions -
New Year's 2013为了庆祝即将到来的
year++
,我觉得编译一个你们最喜爱的tips和tricks的列表一定很好玩。读者可以提交他们最喜爱的和Objective-C之间的琐事、各种框架的奥秘、Xcode的隐藏功能之类的你认为很酷的东西。 -
CGGeometry
除非你是个数学极客或者一个古希腊人,否则几何学应该不是你高中时最喜欢的课程。不过你仍有机会成为那个在课堂上尽职尽责地将所有必要的公式的程序写到你的TI-8X计算器里的那个人。为了保持尽可能少地做数学问题的传统,这里列出了一些不算复杂的 CoreGraphics 函数使你的工作更简单。
-
instancetype
Objective-C 是一门正迅速发展的语言,这种发展速度在别的现有语言中是不曾有过的。从普通到范例转变的发展,真要说清它们之间的差异还得慢慢来。因为我们正在讨论的是底层语言的特性,对于API设计的更深层含义还比较难理解。
-
KVC Collection Operators
Ruby爱好者总爱嘲笑Objective-C臃肿的语法。尽管新的Object Literals语法让我们瘦了几斤,但那些红头发的恶霸们还总是用他们的单行map和花哨的#to_proc符号嘲讽我们。幸运的是,我们有键-值编码这个王牌。
-
NSOrderedSet
为什吗
NSOrdered
不是继承自Set NSSet
的捏?答案可能会让你大吃一惊。 -
NS_ENUM & NS_OPTIONS
一个专业的Objective-C工程师应该在面向对象和面向过程范式间优雅地切换,同时能够掌握二者的优势。
-
NSValueTransformer
在 Foundation 框架的所有类中,NSValueTransformer 也许是从 OS X 平台迁移到 iOS 平台表现最差的那个。但是,经过一些雕琢和使用场景的改变,也许它能在你的应用中发挥重大作用。
-
NSURLProtocol
Foundation库的URL加载系统是每个iOS工程师应该熟练掌握的。而在Foundation库中所有与网络相关的类和接口中,NSURLProtocol或许是最黑科技的了。
-
UILocalizedIndexedCollation
当 UITableView 有一百来行时,它就变得有些笨重了。如果用户为了找到他们想要的东西,像玩水果忍者的猫那样疯狂地滑动屏幕时,你可能会想要重新考虑一下用户界面的展现方式。
-
NSLinguisticTagger
NSLinguisticTagger在语言学功能上来讲是一把名副其实的瑞士军刀,它可以讲自然语言的字符串标记为单词、确定词性和词根、划分出人名地名和组织名称、告诉你字符串使用的语言和语系。
-
AddressBookUI
Address Book UI是用来在用户地址簿展示、选择、编辑和创建联系人的iOS框架。与Message UI框架相似,Address Book UI包含了一些可以用dismissViewControllerAnimated:completion:方法来展示的试图控制器,它通过一些统一的接口提供常用的系统功能。
-
@
所以如果我们要对这难以捉摸的 Objective-C 品种观“码”,我们要看些什么?方括号,长的荒唐的方法名,和 @ 指令。”at” 符号编译器指令对于理解 Objective-C 的格式以及其起源和底层机制非常重要。它是使得 Objective-C 如此强大,具有表现力,并仍能一路编译成底层 C 语言的关键。
-
#pragma
#pragma 声明是彰显Objective-C工艺的标志之一。虽然 #pragma最初的目的是为了使得源代码在不同的编译器下兼容的,但精明的 Xcode 编码器将 #pragma 使用到了极致。
-
UICollectionView
从现在起,UICollectionView凭一己之力改变我们将要设计和开发iOS应用的方式。这并不是说,collection views是未知或模糊的。作为一个NSHipster,不仅仅是知道名不见经传的石头,更多是在它们家喻户晓、售罄一空之前就知道有前途。
-
NSCharacterSet
基础类库(Foundation)拥有最好的、功能也最全的string类的实现。但是仅当程序员熟练掌握它时,一个string的实现才是真的好。所以本周,我们将浏览一些基础类库的string生态系统中经常用到且用错的重要组成部分:NSCharacterSet。
-
UIAccessibility
辅助功能,如同国际化一样,是一个很难让开发者提起兴致来的话题,但是你也知道,让你对这些东西感兴趣起来就是 NSHipster 的任务。
-
NSLocale
产品的国际化就像牙线:所有人都知道他们应该使用,却可能都不去用。
-
CFBag
在计算机科学领域集合数据类型的殿堂中,bag没有数组、集合、联合数组、树、图、优先队列那么占有一席之地。其实bag本身就很晦涩,你可能从没听过这东西。
-
NSOperation
我们都知道,让程序瞬间加载并且快速响应的秘诀在于后台异步执行任务。
-
NSIncrementalStore
即使这个博客就是专门讲一些晦涩接口,但是
NSIncremental
又刷新了我们对与“晦涩”这个词的理解。这个接口在iOS 5中被发布,相对于其他大家一定会用到的条目,它并没有在更新日志里有更着重的声明。但是讽刺的是,它有可能是iOS 5的API里最重要的一个,它将从现在开始改变我们创建应用的方式。Store -
CFStringTransform
NSString 是基础类库中的佼佼者。 它虽然很强大,但是不提提它的可无缝转换的表兄弟 CFMutableString,或者更特殊的 CFStringTransform,是不负责任的。
-
NSDateComponents
NSDate
类在Foundation的日期和时间API中扮演着重要的角色。其本身并没有什么令人印象深刻的特征,仅仅是一个日期信息的容器(信息包括:月,年,月中的某天,年中的某周,或者是否是闰月)。然而,值得一提的是,在其结合</wbr>Components NSCalendar
和NSDate
类之后,日历格式的转换变得十分方便。</wbr>Components -
NSSortDescriptor
排序:它是CS(计算机科学)入门课程考试和初级编程面试白板考题的主流考题。不管怎么样,你上一次真正需要知道如何实现快速排序是什么时侯?
-
NSCache
可怜的
NSCache
一直处于NSMutable
的阴影之下。就好像没有人知道它提供了垃圾处理的功能,而开发者们却费劲力气地去自己实现它。</wbr>Dictionary -
NSIndexSet
NSIndex
(以及它的可修改子类,</wbr>Set NSMutable
) 是一个排好序的,无重复元素的整数集合。它看上去有点像 支持离散整数的</wbr>Index </wbr>Set NSRange
.它能用于快速查找特定范围的值的索引,也能用于快速计算交集, 同时,Foundation collection class 提供了很多好用的方法,方便你使用NSIndex
.</wbr>Set