Objective-C 相当于 Java 包吗?

2024-03-16

Java 包的 Objective-C 等价物是什么?你如何用 Objective-C 来分组和组织你的课程?


问题 1:Objective-C 相当于 Java 包吗?

Objective-C 没有与 Java 包或 C++ 命名空间等效的东西。部分原因是 Objective-C 最初是 C 之上的一个非常薄的运行时层,并且可以轻松地将对象添加到 C 中。对我们来说不幸的是,命名冲突是我们在使用 Objective-C 时必须处理的问题。你赢得了一些,你失去了一些......

一个小小的澄清(尽管这并不能带来太多安慰)是 Objective-C 实际上有两个平面命名空间——一个用于类,另一个用于协议(如 Java 的接口)。这并不能解决任何类命名冲突,但它确实意味着您可以拥有同名的协议和类(例如 http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/ and NSObject http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/),后者通常采用(“实现”)前者。此功能可以防止 Java 中“Foo / FooImpl”模式泛滥,但遗憾的是对解决类冲突没有帮助。

问题 2:如何命名和组织 Objective-C 课程?

Naming

以下规则是主观的,但它们是命名 Objective-C 类的不错的指南。

  1. 如果您的代码无法由其他代码运行(它不是框架、插件等,而是最终用户应用程序或工具),您只需避免与链接的代码发生冲突即可。通常,这意味着只要您使用的框架/插件/捆绑包具有正确的命名空间,您就可以完全没有前缀。
  2. 如果您正在开发“组件化”代码(例如框架、插件等),您应该选择一个前缀(希望是唯一的)并在可见的地方记录您对它的使用,以便其他人知道避免潜在的冲突。例如,CocoaDev 维基“注册表” http://www.cocoadev.com/index.pl?ChooseYourOwnPrefix是一个事实上的公共论坛,用于在前缀上调用“dibs”。但是,如果您的代码类似于公司内部框架,则您可以使用其他人已经使用的前缀,只要您不使用带有该前缀的任何内容即可。

组织

不幸的是,许多 Cocoa 开发人员都忽略了在磁盘上组织源文件的事情。当您在 Xcode 中创建新文件时,默认位置是项目目录,就在您的项目文件旁边等。就我个人而言,我将应用程序源放在source/、测试代码(OCUnit等)中test/,所有资源(NIB/XIB 文件、Info.plist、图像等)资源/, 等等。如果您正在开发一个复杂的项目,那么根据功能将源代码分组到目录层次结构中也可能是一个很好的解决方案。无论如何,组织良好的项目目录可以让您更轻松地找到所需内容。

Xcode 实际上并不关心你的文件所在的位置。项目侧边栏中的组织完全独立于磁盘位置 - 它是逻辑(而非物理)分组。您可以在侧栏中以您喜欢的方式进行组织,而不会影响磁盘位置,当您的源存储在版本控制中时,这很好。另一方面,如果您在磁盘上移动文件,则修补 Xcode 引用是手动且乏味的,但可以完成。最简单的方法是从一开始就创建组织,并在文件所属的目录中创建文件。

我的想法

虽然拥有包/命名空间机制可能很好,但不要屏息以待它的发生。阶级冲突在实践中很少见,并且当它们发生时通常是非常明显的。命名空间实际上是 Objective-C 中非问题的解决方案。 (此外,添加命名空间将消除对前缀等解决方法的需要,但可能会在方法调用等方面引入更多的复杂性。)

更微妙和狡猾的错误来自方法冲突当添加和/或重写方法时,不仅是子类,而且是类别,这可能会导致严重的错误,因为类别的加载顺序是未定义的(不确定的)。实现类别是 Objective-C 最锋利的优势之一,只有当您知道自己在做什么时才应该尝试,特别是对于第三方代码,并且尤其用于 Cocoa 框架类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-C 相当于 Java 包吗? 的相关文章

  • 如何改进 iOS 中的 TWTweetComposeViewController 代码?

    我已经实现了以下代码来进行 Twitter 共享 在我的代码中 我尝试测试 iOS 5 如果这不起作用 我会回到使用 ShareKit 的 Twitter 代码进行共享的旧方式 我向同事展示了代码 他建议我的代码可能有缺陷 我需要做两件事
  • 替代已弃用的 NSNibLoading 方法(loadNibFile:、loadNibNamed: 等)?

    我发现 NSBundle 中的 NSNibLoading 方法 NSBundle loadNibFile externalNameTable withZone NSBundle loadNibNamed owner NSBundle loa
  • 使用 NSSet/NSMutableSet 来过滤对象?

    我已经看到一些有关使用 NSSet NSMutableSet 过滤对象的问题 答案 这些情况使用简单类型的对象 例如NSString or int 以下是用于过滤的代码示例NSString对象 NSSet smallArray NSSet
  • 跟踪所有 ObjC 方法调用?

    有时 当查看别人的大型 Objective C 程序时 很难知道从哪里开始 在这种情况下 我认为记录对每个非 Apple 方法的每次调用会很有帮助 有没有办法做到这一点 基本上 在某个中心位置进行一项更改 并记录调用的每个方法 最好仅限于非
  • 从 Plist 中存储和检索 [重复]

    这个问题在这里已经有答案了 可能的重复 iOS 在 plist 文件中存储两个 NSMutableArray https stackoverflow com questions 6070568 ios store two nsmutable
  • 使用 Objective-C 在 iPhone 应用程序中显示或隐藏 UIButton

    我在用UITextView编辑文本 我想用两个UIButtons编辑并保存 最初我想显示编辑UIButton 当用户单击编辑时我想显示保存UIButton 当内容成功保存后 我不想再显示保存按钮 我是一名 C 编码员 在 C 中我曾经这样做
  • iOS:从非图像数据生成图像(Godus,如风景)

    所以看到图像后Godus http www kickstarter com projects 22cans project godus我想知道如何生成简单的 非交互式的 2D 图像 with 不同高度或层数的颜色不同就像下面的图片一样 我只
  • 在 iOS 中录制音频并永久保存

    我制作了 2 个 iPhone 应用程序 可以录制音频并将其保存到文件中并再次播放 其中之一使用 AVAudiorecorder 和 AVAudioplayer 第二个是苹果的在这里说话 http developer apple com l
  • 从 NSError 返回 NSString

    我正在使用NSURLRequest我的 iPhone 应用程序中的类 调用它的方法返回一个NSString这对于连接正常时非常有用 但问题是我需要将 NSError 转换为 NSString 以便我可以将其返回或运行一些if 对此的声明 有
  • 如何在ios中以编程方式添加水平间距和垂直间距?

    我在 ios 8 中创建了一个应用程序 因为我有 4 个可垂直使用的标签 它应该在某些条件下更改位置 所以我已禁用自动布局并以编程方式设置约束 现在的问题是 我可以设置水平和垂直位置 宽度和高度的约束 但我找不到任何方法来添加标签之间的水平
  • 增加 NSData 的长度

    基本上 我有一个 46 个字符的 NSString 我将其转换为 NSData 我需要将字符串填充到 48 个字符 仅在 NSString 末尾添加 是行不通的 所以 我只是使用以下方法增加了 NSData 的长度 NSString str
  • 为什么 GDB 调试器不断冻结 Xcode 4?

    这真是一个奇怪的错误 我正在开发一个使用相机源的 iPhone 项目 并通过 OpenGL 着色器运行它以对其应用效果 然而 每次我在代码中简单地创建一个新的 GLfloat 时 调试器都会在启动时冻结 我无法复制和粘贴文本 因为整个 XC
  • 以编程方式更改 UISlider 的范围

    如何以编程方式设置 UISlider 的最小最大范围 例如 虚拟代码 UISlider slider UISlider alloc init slider min 3 slider max 3 EDIT 所以我有以下内容 sl minimu
  • ObjC <-> Swift 桥接和工厂方法

    我想从 Swift 使用一些 Objective C 类 由于超出了这个问题范围的原因 我的班级init方法被标记为不可用 相反 有一个工厂方法 这是我的班级的简化形式 interface MyClass NSObject instance
  • 监控剪贴板活动可可?

    是否可以在可可中 观看 用户剪贴板 例如 如果我的应用程序是系统托盘样式应用程序 例如 dropbox 客户端 我可以订阅用户在另一个应用程序中点击复制 粘贴时引发的事件吗 你可以随时查看Apple的示例代码 剪贴板查看器 http dev
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • 如何使用苹果钥匙串?

    我正在尝试使用scifihifi iphone 来自 Github http github com ldandersen scifihifi iphone tree master security存储和检索用户名和密码 但是 当我添加课程时
  • 如何使用所有类型的 UTI 初始化 UIDocumentPickerViewController

    我想打开 UIDocumentPickerViewController 并且它应该允许用户选择所有类型的文件 我尝试在 UIDocumentPickerViewController init 方法中提及所有 UTI 但仍然找不到某些文件 如
  • 为什么类方法中的“self = [[Rectangle alloc] init]”是错误的?

    在 Apple 的文档 Objective C 编程语言 中 第 48 页说道 Rectangle rectangleOfColor NSColor color self Rectangle alloc init BAD self setC
  • 如何多次从 NSHTTPCookieStorage 中清除 cookie?

    我的桌面应用程序连接到 Google App Engine 上托管的网络应用程序 一旦通过身份验证 它就会获得一个 authtoken cookie 并为所有未来的请求传递该 cookie 这一切都有效 但现在我想添加 退出 我尝试像这样实

随机推荐

  • 自动运行多个 vim 命令和击键

    我想在 vim 中自动运行多个命令 即通过键入 repl 命令是 ConqueTerm lein repl
  • AChartEngine 的 Android 问题:在边距中设置图像

    是否可以将图像设置为背景边距 我通常使用mRenderer setMarginsColor Color argb 0x00 0x01 0x01 0x01 但我想设置一个图像 您无法在 AChartEngine 中将图像设置为背景 因为它是开
  • 使用点“.” MVC4 路由中的角色

    我目前正在提供来自数据库表的图像 这些图像都是相同的文件类型 我想要字符点 路线 但尚未取得任何成功 据我了解 ISAPI 处理程序可能会导致与此相关的问题 我只是不确定如何添加和排除以允许 ASP NET 处理此路由 routes Map
  • jQuery ajax json 响应的长度未定义且数据不正确

    我试图获取一个在服务器端转换为 json 对象的字典对象 以及正确的内容类型标头 但由于某种原因 即使我可以访问部分数据 其他部分也不会显示up 和 jquery 中的 json 对象的长度等于 0 这是我的 jquery 调用 ajax
  • 什么是 __main__.py?

    是什么 main py文件 我应该在其中放入什么样的代码 什么时候应该有一个 通常 Python 程序是通过在命令行上命名 py 文件来运行的 python my program py 您还可以创建一个充满代码的目录或 zip 文件 并包含
  • Antlr 语法生成无效的 C# 代码

    我正在尝试使用 ANTLR 和 StringTemplate 库开发一个 C 代码生成器 AntlrWorks 可以生成 C 解析器和词法分析器文件 而不会报告任何错误 但是 c 解析器代码无效 无法在 Visual Studio 中编译
  • Celery 3.0.1 中的框架错误

    我最近从 2 3 0 升级到 Celery 3 0 1 所有任务都运行良好 很遗憾 我经常收到 帧错误 异常 我还运行主管来重新启动线程 但由于这些线程从未真正被杀死 主管无法知道 celery 需要重新启动 有没有人见过这个 2012 0
  • 在 AWS Code Pipeline 中使用 docker compose 时出错

    我正在使用 AWS Code Pipeline 部署我的 dockerized Django 应用程序 但遇到了一些 Docker 错误 error Service proxy failed to build toomanyrequests
  • 如果满足特定条件,则停止沿特定深度的 boost::depth_first_search

    我在用着BGL http boost org doc libs 1 45 0 libs graph doc table of contents html来存储我的 DAG 顶点有状态 考虑到其中一个顶点的状态发生变化 我想更新依赖顶点 我可
  • 用于格式化一系列单元格并根据 Google 电子表格中的日期插入特定文本的脚本

    我有一个规划器类型的 Google 电子表格 其中每天有 8 10 个用户添加数据 当我向单元格添加日期时 我希望对该日期之后同一行中的所有单元格进行格式化并添加类似 ENDED 的文本值 目前 我正在使用条件格式和 ArrayFormul
  • -[NSRangeException raise] 上的符号异常断点

    在 Xcode 中添加符号断点为您提供了一个示例模板 NSException raise 我想做同样的事情但是具体来说 on NSRangeException raise 原因是我想断点only关于特定数组边界异常 例如 Terminati
  • 如何使用 Traefik 进行 WebSocket 后端

    我正在尝试为 WebSocket 应用程序配置 Traefik 我只是尝试在 docker 上使用一个简单的 WS 应用程序 https hub docker com r jmalloc echo server https hub dock
  • 过滤空手道测试响应对象以获得子列表?

    鉴于此功能文件 Feature test Scenario filter response def response a a b a c a d ab e ab f ab g ac h ac i ac
  • 建模:Xml 与关系数据库

    我想知道是否有最佳实践来决定何时应使用 XML 对系统进行建模以及何时应使用关系数据库进行建模 我知道您可以将 XML 存储在数据库中 但是对系统进行建模之间存在巨大差异使用标准化数据库表并使用 XML 模式对系统进行建模 为了具体起见 假
  • 从 rpy2 传递到 R 的什么对象?

    我无法使以下代码工作 尽管我没有看到此错误在 R 中严格工作 from rpy2 robjects packages import importr from rpy2 import robjects import numpy as np f
  • R 中的 Markdown 表到数据框

    有多种方法可以将数据框转换为 Markdown 表 但是 给定 Markdown 表 如何转换回数据帧 给定一个表格 Table Header Second Header Table Cell Cell 2 Cell 3 Cell 4 或者
  • Python函数参数:元组/列表

    我的函数需要一个列表或元组作为参数 它并不真正关心它是什么 它所做的只是将其传递给另一个接受列表或元组的函数 def func arg arg is tuple or list another func x do other stuff h
  • 工厂女孩在我的开发数据库中保存记录

    我有一个非常奇怪的问题 我不知道应该去哪里找到它 我正在使用 rspec 和 Factory Girl 开发一个 Rails 3 应用程序进行测试 由于某种原因 每当我运行任何rails命令 例如 rake数据库 启动开发服务器等 时 都会
  • 如何避免 svgs 的foreignObjects 内的元素缩放?

    我想使用 svg 作为 div 元素的容器 该元素应包含多个元素 目前它看起来像这样
  • Objective-C 相当于 Java 包吗?

    Java 包的 Objective C 等价物是什么 你如何用 Objective C 来分组和组织你的课程 问题 1 Objective C 相当于 Java 包吗 Objective C 没有与 Java 包或 C 命名空间等效的东西