Key-Value Coding & Key-Value Observing

Key-Value Coding

  1. Key-Value Coding是什么?
  2. 为什么要用Key-Value Coding?
  3. 如何使用Key-Value Coding?

Key-Value Coding是什么?

Key-value coding is a mechanism for accessing an object’s properties indirectly, using strings to identify properties, rather than through invocation of an accessor method or accessing them directly through instance variables.

Key-value coding是一种间接访问对象属性的机制,使用字符串去标识属性,而不是通过调用存取方法或者通过实例变量直接访问它们。

为什么要用Key-Value Coding?

  1. Scripting(OS X);
  2. 简化代码和提高灵活性;

如何使用Key-Value Coding?

我们先熟悉些下key-value coding术语,后文我们用术语来阐述,方便交流。

除了重载现有的术语,key-value coding定义了些专属的术语。

Key-value coding可以被用来访问三种不同的类型的对象值:attributes, to-one relationships, 和to-many relationships。术语property指三种类型值的任意一种。

attribute 是简单值的 property,像标量,字符串,或者布尔值。NSNumber和其他的不可变类型如NSColor也都被认为是attributes。

to-one relationship 是拥有自己properties的对象。这些内部的properties可以改变而对象却不变。例如,NSView实例的superview就是to-one relationship。

to-many relationship 包括一个相关对象的集合。NSArray或NSSet经常被用来持有这样一个集合。但是,key-value coding允许你使用自定义的类作为集合,通过实现在to-many Properties中讨论的key-value coding存取方法仍然可以可以像NSArray或NSSet那样访问它们。

要使用 Key-Value Coding,对象要符合 Key-Value Coding Compliant,符合 Key-Value Coding Compliant 则有两点要求:一是对象遵守 NSKeyValueCoding 协议;二是要实现规定的方法。

因为 NSObject 已经遵守 NSKeyValueCoding 协议,所以类继承 NSObject 这个要求就默认满足了。于是重点就是实现规定的方法。那么规定的方法是哪些呢?

对于 Attribute 和 To-One Relationship Compliance

  • 实现 <key> 或者 is<Key>, 或者创建 <key> 或者 _<key> 实例变量。
  • 如果属性可变,实现 set<Key> 方法。
  • 如果属性是标量,覆盖 setNilValueForKey: 方法去优雅处理 nil 。

对于 to-many relationship 的属性,实现上述方法后,我们就可以对集合对象本身使用 KVC 了。但是如果我们还实现额外规定的集合存取方法,我们可以得到更多好处:

  • 用 NSArray 或 NSSet 之外的类为 to-many relationships 建模。
  • 改变 to-many relationships 时性能更好。
  • 提供 Key-Value observing compliant 访问你对象的集合属性的内容。

额外规定的集合存取方法如下:

  • Accessing Indexed Collections

    • Indexed Collection Getters

      • countOf<Key>
      • objectIn<Key>AtIndex: or <key>AtIndexes:
      • (可选)get<Key>:range:
    • Indexed Collection Mutators

      • insertObject:in<Key>AtIndex: or insert<Key>:atIndexes:
      • removeObjectFrom<Key>AtIndex: or remove<Key>AtIndexes:
      • (可选)replaceObjectIn<Key>AtIndex:withObject: or replace<Key>AtIndexes:with<Key>:
  • Accessing Unordered Collections

    • Unordered Collection Getters

      • countOf<Key>
      • enumeratorOf<Key>
      • memberOf<Key>:
    • Unordered Collection Mutators

      • add<Key>Object: or add<Key>:
      • remove<Key>Object: or remove<Key>:
      • (可选)intersect<Key>:
继续阅读

(翻译)iOS 设计模式

iOS 设计模式–你也许听说过这个术语,但是你知道它意味着什么吗?尽管大多数开发者可能同意设计模式非常重要,但关于它的文章并不多,咱们开发者们写代码时并没有花太多注意力放到设计模式上。

在软件设计中设计模式是常见问题的可复用的解决方法。他们被设计成模板帮助你写出容易理解和复用的代码。他们也帮助你写出低藕合的代码以便你不需要太多争论就能改变或替换你代码的组件。

如果你刚刚接触设计模式,告诉你些好消息!首先,你已经使用过很多设计模式,这得感谢Cocoa 建立的方式以及你被鼓励使用的最佳实践。其次,这篇教程将让你掌握 iOS 的主要(次要)设计模式,它们在 Cocoa 中很常用。

教程分成多个部分,每部分包含一种设计模式。在每部分,你会看到如下顺序的解释:

  • 该设计模式是什么;
  • 你为什么应该使用它;
  • 如何使用它,以及什么场景合适,使用时需要留意的常见陷阱;

这篇教程中,你将创建一个 Music Library 应用,它会显示你的专辑和它们相关的信息。

在开发应用的过程中,你会慢慢熟悉多数常见的 Cocoa 设计模式:

  • 构造类:单例(Singleton)和 抽象工厂(Abstract Factory);
  • 架构类:模型-视图-控制器(MVC), 修饰(Decorator), 适配器(Adapter), 门面(Facade)和合成(Composite);
  • 行为类:观察者(Observer), 记忆(Memento), 响应链(Chain of Responsibility)和命令(Command)。

别被误导认为这是篇纯理论的文章;你会在你音乐应用中使用这些应用模式中的大多数。你的应用最终看起来像这样:

继续阅读

为MacBook Pro配置一个像guake的终端

以前在Arch下经常使用一个名为guake的终端,体验很好,用MacBook Pro之后也想有个这样的终端,由于各种原因,这事一直耽搁着,但并没有放下,今天特意找了下,还真找到了。不费话了,进入正题。

让iTerm2的行为像guake

1)下载iTerm2,然后解压;

2)打开iTerm2,然后iTerm2–>Prefences…->Profiles;

3)创建一个新Profiles,命名为guake;

4)在Window选项中根据自己的喜好配置;

5)在Keys选项中激活"Show/hide iTerm2 with a system-wide hotkey",由于F12用来移动到Dashboard,只能用其他的快捷键了,可以根据自己喜好设置,我这里设置为⌘F12,(Note:⌘ + fn + F12);

继续阅读