- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在做一个 iPhone 应用程序的项目。我们有一位 Cocoa 顾问来了几周。他向我展示了一个有趣的 Cocoa 惯用语,处理接口(interface),但我们之间存在一个困难的语言障碍,他无法真正解释为什么这样做或者它被记录在哪里,所以我可以自己学习更多。我进入了猴子模式,只是使用了他喜欢的风格。但一直困扰着我的是,我对这种风格的历史知之甚少。这当然不是非正式协议(protocol)。果然,查看 Cocoa API header 的一些,我有时会看到他断言的样式是“Cocoa”方式。这是一个示例(注意访问器、修改器等,每个都有自己的接口(interface)声明,没有有趣的大括号):
@interface AViewController : UIViewController <UITextViewDelegate> {
@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) <UITableViewDelegate, UITableViewDataSource>
@end
您可以在 NSButton、NSControl 等中看到这种设置界面的风格。有趣的是,相应的类,如 UIButton、UIControl DON'T 使用这种习惯用法。嗯,这些可能是在我认为 UIKit 是在 AppKit 之后完成的。那么这个成语是“old hat”吗?另外,除了风格之外还有什么原因吗?风格好吗?坏的?有没有关于这个的文档?谢谢大家。
最佳答案
这些在 Objective-C 中被称为“类别”。类别使同一个类可以有多个@interface 和@implementation block 。这甚至在您可以在标准 Apple 框架中的类上添加方法的范围内起作用,例如在 NSString 上添加一个类别以向其添加新方法。类别可以添加方法但不能添加实例变量,因此在您的示例中,第一个 @interface 是核心类声明,所有其他类别都是 AViewController 类上的类别。
这无论如何都不是“老帽子”,但您的示例将类别的使用带到了一个相当奇怪的极端。只要将一个类的实现分解为多个 block 在逻辑上有意义,例如,如果该类有一堆方法在逻辑上可以分为两个或多个组,那么类别就有意义。它们有时也用于通过将名为“private”的类别@interface 放在与@implementation 相同的文件中来声明伪私有(private)方法。 ObjC 的动态调度意味着没有私有(private)方法这样的东西,但这种方法避免了发布您不希望人们使用的方法的名称。
上面的例子实际上并没有错,但有点荒谬。这表明承包商的想法是,由于某种原因,每种新方法都应该始终有自己的类别,这是不正确的。
关于iphone - cocoa 界面风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/371808/
我是一家小型非营利组织的技术总监,我们正在制作一个新网站。我们提出了几个不同主页设计的模型,需要接收董事会成员的意见。是否有在线应用程序/程序/框架可以接收和组织用户评论?我正在寻找允许在查看页面时发
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我阅读了很多关于 java 接口(interface)的文章。我知道你可以实现多态性和其他伟大的东西(函数指针等)。我有理论知识,但有一点点或什至没有。我一直在使用很多已经制作好的界面,比如“Runn
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在尝试在 Windows 7 上编写一个 python 脚本来与我的 Wacom Bamboo Pen 数位板交互。 Wacom 建议使用 WinTab API,它工作正常,但不适用于我的应用程序
我正在研究一种远程访问有关 Linux 服务器统计信息的方法,即 conky会显示。 有没有办法与 conky 交互并获取它显示的统计信息?如果没有,您能否推荐一种获取此类统计数据的好方法? (C/C
将所有这些代码包装在 UI: do { } block 中的原因是什么?我在哪里可以获得关于它的明确说明? UI: do { backgroundButton.setImage(UIImage
我需要将 R 连接到某些 C# 应用程序。我安装了 rscproxy_1.3 和 R_Scilab_DCOM3.0-1B5 添加了对 STATCONNECTORCLNTLib、StatConnecto
我正在尝试遍历接口(interface)片段以通过 id 查找我的特定结构并更改属性。 type A struct { ID ID Steps []Step } type Ste
我有两种不同格式的相同界面,一种是键由低破折号分隔的 JSON 格式,另一种是 javascript camelCase 格式: JSON 格式: interface MyJsonInterface
操作系统:Linux。 我正在尝试寻找可能的方法来为我的嵌入式系统实现 Web 界面。 目前有一个外壳(基于文本)和一小组命令用于查询设备。 我是网络开发新手,我的问题是: 我必须使用什么网络服务器?
我正在尝试运行基于 Mechanical Turk Qualtrics 的调查,并且需要一些似乎可以通过 Mechanical Turk API 使用的功能,例如 custom Qualificati
我见过漂亮的 MetroTwit 界面 http://www.metrotwit.com/ ;我想知道使用了哪些 WPF 组件来尝试重现它。 最佳答案 MetroTwit 设计师在这里:) 所有的控件
我有一个小问题。我需要将 Hadoop Web 界面与我们的 Web 应用程序集成。我只需要一个 Hadoop 接口(interface),我们可以在其中运行一些 hadoop 命令,例如 1
假设我有这个 JavaScript 函数: function updateMainBuff(buff) { // do some stuff } 我的
我试图找出一个窗口是否属于当前的虚拟桌面。 我从 winapi 中找到了 VirtualDesktopManager 类,但即使根据 here 它应该位于“shobjidl.h” header 中,当
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 8年前关闭。 Improve this
我的 Tkinter GUI 界面有问题。文本不会在 shell 中打印,但如果将 Entry 放置在第一个 tk 窗口 get() 中,它就可以工作...帮助我吗? 这是我的代码: import o
我有一个在 MATLAB 中实现的随机微分方程组。只有 4 个变量与 Euler-Maruyama 集成,所以没有什么太花哨的......不过,技术细节对于这个问题并不重要。 您建议我如何构建一个 W
对于我创建的插件,我想添加一个网络界面,您可以从中更改设置并执行一些简单的数据操作。此数据操作应通过 sqlquerys 完成。我正在使用 sqlite 数据库,这就是问题开始的地方: 网站(serv
我是一名优秀的程序员,十分优秀!