我正在做一个iPhone应用程序的项目.我们有一位可可顾问进来几周.他向我展示了一个有趣的Cocoa成语,处理界面,但是我们之间存在着一个困难的语言障碍,他无法解释为什么这样做或者记录在哪里,所以我可以自己学习更多.我进入了猴子看模式,并且只使用了他喜欢的风格.但是我一直在喋喋不休地说我不知道这种风格的历史.这肯定不是一个非正式的协议.果然,看看一些 Cocoa API标题,我有时会看到他断言的风格是'Cocoa'方式.这是一个例子(注意访问器,变换器等,每个都有自己的接口声明,没有有趣的大括号):
@interface AViewController : UIViewController{ @public UITableView *tableView; @private NSUInteger someIndex; } @property (nonatomic, retain) ... @end @interface AViewController (AViewControllerCreation) - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withController:(id)controller; @end @interface AViewController (AViewControllerMutator) - (void) doSomeSettingStuff; @end @interface AViewController (AViewControllerAccessor) - (NSString *)doSomeAccessorStuff; @end @interface AViewController (AViewControllerAction) - (IBAction)cancel:(id)sender; @end @interface AViewController (AViewControllerTableViewDelegate) @end
您可以在NSButton,NSControl等中看到这种设置界面的风格.有趣的是,UIButton,UIControl等相应的类不要使用这个习惯用法.嗯,这些可能是因为我认为UIKit是在AppKit之后完成的.那个成语'老帽子'也是这样吗?此外,还有其他原因吗?这是好风格吗?坏?任何文件都超过这个?谢谢大家.
这些是Objective-C中已知的"类别".类别可以为同一个类提供多个@interface和@implementation块.这甚至可以在标准Apple框架中的类上添加方法,例如在NSString上添加类别以向其添加新方法.类别可以添加方法但不能添加实例变量,因此在您的示例中,第一个@interface是核心类声明,其他所有都是AViewController类的类别.
无论如何,它不是"老帽子",但你的例子将类别用于一个相当奇怪的极端.在将类的实现分解为多个块的逻辑意义上,类别是有意义的,例如,如果类有一堆逻辑上属于两个或更多组的方法.它们有时也用于声明伪私有方法,方法是将一个名为"private"的类别@interface放在与@implementation相同的文件中.ObjC的动态调度意味着没有私有方法这样的东西,但这种方法避免发布你更喜欢人们不使用的方法的名称.
上面的例子实际上并没有错,但它有点荒谬.它表明承包商认为每种新方法都应该由于某种原因而总是有自己的类别,这是不正确的.