《Cocoa设计模式》读书笔记(1)

来源:互联网 发布:hyde知乎 编辑:程序博客网 时间:2024/06/10 00:07

新浪微博:东门兜

第3章 两阶段创建(分配与初始化)
类能提供任意数量的初始化方法,而不同的初始化方法能接受不同的变量。如果提供了多个初始化方法,其中一个通常是指定初始化方法。用于NSObject类的指定初始化方法是-(id)init,用于NSView类的指定初始化方法是-(id)initWithFrame:(NSRect)aFrame。提供的每个初始化方法都可以作为指定初始化方法,但必须有清楚的记录。指定初始化方法通常要接受最多的变量。所有其他初始化方法都在实现时调用指定初始化方法。

Cocoa中有很多类提供组合了分配和初始化两个阶段的方法,可返回临时的实例,这种方法叫做简便方法。简便方法在方法的名称中包含类名称。例如,NSString类提供+(id)stringWithString:(NSString *)aString简便方法。获得实例的简便方法始终伴随着类似名称的初始化方法。它的一个缺点是在分配实例的同时放弃了灵活性,因为分配技术在方法中已被锁定。

分配和初始化分开的一个不良后果是,需要注意一些约定,比如指定初始化方法。你必须知道哪些方法是指定初始化方法,以及如何在子类中创建和记录新的初始化方法。从长期角度来讲,使用指定初始化方法能简化软件开发过程,但是对Cocoa开发者来说必须在早期就学习两阶段创建模式。


第4章 模板方法(-dealloc和-drawRect:)
模板方法无非就是一个特别点儿的需要在子类中需要被重写的方法。第3章中提到的-dealloc就是一个模板方法。在没有使用自动垃圾回收的情况下,必须在每个NSObject的子类中重写-dealloc方法来保证之前分配到的资源准确地释放。除了在子类的-dealloc重写实现中调用父类的-dealloc方法外,代码中的任何其他地方都不要直接去调用它。Cocoa在需要的时候会自动调用-dealloc。另外一个常见的模板方法是NSView类里的-drawRect:。与-dealloc一样,-drawRect除了调用父类的实现时用到,其他情况下都不需要直接调用,一般是由Cocoa自动调用的。
如果你发现自己打算在预期进行重写的代码中创建模板方法,首先要考虑委托。在许多情况下,委托提供了对模板方法的更灵活的替代选择。


第5章 动态创建(创建新类)
动态创建用于类之间的解耦,尤其是在一个类可能被另一个类替代的情况下。这种解耦使得开发人员很容易通过插入他们自己的自定义的子类,重写Cocoa框架的某些部分。由于有动态创建,Cocoa可以实例化自定义的类并与之交互,即使在编译Cocoa时它们对于链接器是未知的。
开发人员自己也可以是用动态创建来创建不直接与其他代码耦合的代码。这在创建插件架构时非常有用。也可以使用它来开发很容易拓展的框架。


第6章 类别(类别)
非正式协议的方法通常是在NSObject类的类别中实现的。几乎所有的Cocoa对象都直接或间接继承自NSObject,所以在类别中添加到NSObject中的方法将自动被几乎所有Cocoa对象继承。
匿名类别的工作方式与任何其他类别相似。首先,匿名类别的声明在圆括号里没有类别名。其次,每个类最多只能有一个匿名类别。最后,在匿名类别中声明的方法必须在类的常规的@implementation块中实现。
类别可用于分解大型类的实现。
如果需要把新的实例变量添加到类中,那么子类化可能是优先选择。而对于复杂的类,尤其是那些使用类簇模式的类,则使用类别。

类别用于拓展类簇中的类。
类别用于框架划分。
类别用于分解大型类的实现。
类别用于替换方法。
类别模式的一个目的是允许最有意义地实现和维护代码。


第7章 匿名类型和异类容器(id和集合)
Objective-C语言提供的匿名类型id,代表指向任意对象的指针。假如我们可以不必理会对象类,但它必须符合MYProtocol。可以用如下方式定义变量:
id myProtocolObject;

Cocoa提供了能满足大多数应用程序需求的少数收集类。每个集合都用来存储id类型的变量。因此该集合被称为“异类”,意思是它能引用任意组合任意类型的对象。此收集类自动保留存储必要对象所需的额外存储空间。
NSArray和NSMutableArray,NSDictionary和NSMutableDictionary,NSSet、NSMutableSet和NSCountedSet。


第8章 枚举器(NSEnumerator)
枚举器提供了一种一致的方式,可以独立于集合类型和遍历算法遍历对象的集合。这种解耦允许开发人员从一种集合类型改变为另一种集合类型,或者选择不同的遍历算法,而无须更改他们的所有集合遍历代码。
在Cocoa中,通过子类化NSEnumerator并且采用NSFastEnumeration协议实现枚举。在其他框架中,NSEnumerator的角色通常称为迭代器模式,尽管枚举器通过允许灵活地选择遍历算法也可以充当策略模式的特例。


第9章 执行选择器和延迟执行(SEL,IMP和afterDelay:)
执行选择器和延迟执行模式使得有可能发送可变的消息以及在将来可变的时间发送消息。


第10章 访问器(property)
Cocoa常常提供按值返回非对象属性的访问器,而极少提供按引用返回非对象属性的访问器,并且这样的访问器方法总是在其名称中包括有单词“get”。仅当返回的属性的大小是可变的或者通过一个方法返回多个值时,才使用这类的访问器。


第11章 解档和归档(NSCoding)
NSUserDefaults只能存储以下类的实例对象:NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary。Cocoa利用NSColor类封装颜色,该类不再受NSUserDefaults直接支持的类列表中。如果想在用户默认设置中存储颜色,可以结合使用第6章中的类别模式与归档和解档模式拓展NSUserDefaults。


第12章 复制(Copying)
C程序设计语言使用称为按值传递的技术给函数提供参数。按值传递意味着参数是隐式复制的,使得对函数内的参数所做的更改只会影响副本,而不会影响原始值。不过,有可能传递一个指向值的指针,然后通过指针间接改值。
如果你需要传递指针给对象之一,但是希望确保对象不会被更改,一种方法是复制对象并传递一个指向副本的指针,而不是传递一个指向原始对象的指针。不管对副本执行了什么更改,原始对象总会保持不变。

0 0
原创粉丝点击