Formal Protocol 与Informal Protocol
@protocol
这个关键字是在Objective-C 2.0 之后出现的,在这之前要定义protocol,则是写成NSObject 的category,前者叫做formal protocol,后者则称为informal protocol。UIKit 问世时就采用Objective-C 2.0 语法,至于Mac OS X,苹果在2008 年开始大幅改写Foundation 与AppKit,现在(2012 年)绝大多数可以看到的protocol,都是formal protocol,但如果你在maintain 一份稍微有点历史的代码,或是在苹果少数的API 中,还是可以看到informal protocol。
在Core Animation里头,就可以看到CALayerDelegate
、CALayoutManager
、CAAnimationDelegate
,都还是informal protocol。其中CALayerDelegate
、CALayoutManager
两者之间还夹着CAAction
这个formal protocol—在两个informal protocol中间夹着一个formal protocol,实在让人很反感—为什么不一起改掉呢?至于CAAnimationDelegate
也很怪异:CAAnimation的delegate不是用assign,而是会retain起来。