Objective-C 中的全局变量 - extern 和 .m 文件顶部声明的差异

2024-01-24

我知道你可以使用“extern”在 Objective-C 中定义一个全局变量,但我刚刚意识到我在第一个方法之前在 .m 文件顶部声明的变量也意外地是全局的(这导致了一些问题)问题)。我将它们移至头文件的 @interface 部分,我认为这正确地将它们声明为仅存在于类中,这解决了我的一些问题,但我仍然有点困惑。

将变量声明为 extern 并将其放在 .m 文件的顶部有什么区别?或者这些会导致同样的结果吗?


extern 是一种明确声明的方式,为了可读性和编译时执行,您只是宣告这个变量在这里,实际上期望它是defined别处。如果您还尝试定义 extern 变量,编译器会告诉您方法的错误。这对于全局变量来说非常有用,可以防止名称冲突和多重定义,这两者都会导致链接器错误。然而,extern 关键字本身并不使该变量成为全局变量。

使变量成为全局变量的是其在文件中声明的位置。如果您要在类的头文件中的 @interface 之外声明一个变量,那么您将声明一个在类的所有实例以及 #imports 标头的任何人之间共享且可见的变量。如果您要(并且显然确实)在类的 .m 文件中的 @implementation 之外声明了一个变量,那么您还将声明一个在类的所有实例之间共享的变量,但对任何人来说都是不可见的。 #导入你的标题。

因此,使用变量声明的位置来确定范围。你只会define这些全局变量集中在一处。对于您发现的所有其他地方declare他们,在声明前加上 extern 前缀,以使代码可读,您的意图清晰,并确保您不会尝试再次定义它。

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

Objective-C 中的全局变量 - extern 和 .m 文件顶部声明的差异 的相关文章

  • 在 UIViewController 上添加 UIView

    我想在 uiviewcontroller 上添加一个 自定义 uiview 这个自定义视图是我用 xib 创建的 它与视图控制器分开 有谁知道如何将带有 xib 的 uiview 添加到 uiviewcontroller 中 提前谢谢了 您
  • iOS - 自动调整 CVPixelBufferRef 的大小

    我正在尝试裁剪和缩放CMSampleBufferRef基于用户的输入 基于ratio 下面的代码采用 CMSampleBufferRef 将其转换为 CVImageBufferRef 并使用 CVPixelBuffer 根据其字节裁剪内部图
  • 处于编辑模式时滑动即可删除

    我有一个使用 uitableview 的 iPhone 应用程序 我希望始终显示 重新排序 控件 并让用户滑动以删除行 我目前采取的方法是将表格视图置于编辑模式并允许在编辑模式下进行选择 self tableView editing YES
  • 正确地从 NSString 创建图像

    我正在从字符串变量创建图像 以下是创建图像的代码片段 UIImage imageFromText NSString text FontName UIFont font set the font type and size UIFont fo
  • C++ 引用类型作为 Objective-C++ 中的实例变量

    Objective C 中禁止将 C 引用类型用作实例变量 我该如何解决这个问题 您不能明智地使用引用作为实例变量 因为无法初始化实例变量并且无法重新放置引用 另一种选择可能是简单地使用 可能是智能的 指针 另一种让您更接近 C 行为的可能
  • 如何在变量中存储包含哈希标记的完整 url?

    我正在尝试存储一个网址 例如 http localhost pro print index php page home http localhost pro print index php page home 在变量中 但我找不到执行此操作
  • 动态增加UITableViewCell中UILabel的高度?

    我有一个 UITableView 其中显示一个自定义单元格 我的单元格有两个标签和一个视图 如下图所示 我已经像这样给出了左视图的约束 项目标签限制 中心视图约束 右视图的约束 I am using a bean class to stor
  • CoreMediaIO,错误更新的属性 kCMIODevicePropertyDeviceIsRunningSomewhere

    当某些进程开始使用相机时 我需要接收一个事件 我通过 CMIOObjectGetPropertyData 完成此操作 但它不能正常工作 只有第一次访问时才是正确的值 我还尝试使用 CMIOObjectAddPropertyListenerB
  • UIAlertController 在 iOS 9 中不工作

    I have added the UIAlertController code showing login and password textfields it works for iOS 8 but in iOS 9 not works
  • UITextField 文本更改事件

    如何检测文本字段中的任何文本更改 委托方法shouldChangeCharactersInRange适用于某些东西 但它并不能完全满足我的需求 因为在它返回 YES 之前 textField 文本不可用于其他观察者方法 例如在我的代码中ca
  • iOS:调用 Objective-C 方法的处理开销是多少?

    我正在编写一些实时音频处理代码 该代码将在音频单元的渲染回调中执行 该线程处于系统识别的最高优先级 Apple 指示最大限度地减少此调用中进行的处理量 他们的建议之一是避免 Objective C 方法调用 But why 调用 Objec
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • UIButton 图像未更改/更新

    首先 我对 Objective C 还很陌生 并且仍在尝试尽可能多地学习 所以请耐心等待 现在我有一个以编程方式创建的 UIButton 按下按钮时 将显示一个 UIActionSheet 其中包含 相机 选择照片 或 取消 选项 然后 按
  • UISegmentedControl 中的自定义字体禁用调整FontSizeToFitWidth

    我已经为我的 UISegmentedControl 设置了自定义字体 但它似乎禁用了默认字体自动调整字体大小以适合宽度范围 Before After 这是我用来设置自定义字体的代码 UISegmentedControl segmentedC
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 最近打开的应用程序[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有什么方法可以获取最近打开的应用程序 例如 4 个 的列表吗 如果是这样 怎么办 可可麦克 看看LaunchServices LSSh
  • 是否有适用于 iPad 2 的条码扫描仪 SDK? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后

随机推荐

  • 使用 JavaScript 通过 websocket 进行视频流传输

    最快的直播方式是什么live使用 JavaScript 制作视频 TCP 上的 WebSockets 是否是足够快的协议来传输 30fps 的视频 TCP 上的 WebSockets 是否是足够快的协议来传输 30fps 的视频 是的 是的
  • TYPO3 扩展生成器多个图像上传不起作用

    我的目标是使用 TYPO3 7 6 2 版本中的扩展生成器创建扩展 我从扩展构建器文档创建了类别产品扩展 除了上传单个图像之外 它工作得很好 但我必须创建将多个图像添加到单个产品并在前端显示图像轮播的功能 但扩展生成器不适用于文件上传 我是
  • 组合连续原子变量的存储/加载

    参考 稍微过时的 paper http www open std org JTC1 SC22 WG21 docs papers 2007 n2338 html作者 Hans Boehm 在 原子操作 下 它提到内存模型 当时提出 不会阻止优
  • 使用 Swift 强制 NSLocalizedString 使用特定语言

    通过 swift 我如何强制我的应用程序从特定的 Localized strings 读取数据 我在实例化 ViewController 之前将其放入 didFinishLaunchingWithOptions 中 但它仍然以英语显示应用程
  • 斯威夫特3;范围“超出范围”

    我刚刚将 Xcode 更新到 8 0 beta 2 和 swift 3 0 从 swift 2 3 更新后 我遇到了很多错误 我有一个字符串扩展 它将 self 字符串中的范围转换为 NSRange extension String fun
  • 为什么我应该用 c++ 而不是 c 设置插件接口

    由于我的previous https stackoverflow com questions 1054697 why isnt my new operator called 问题 https stackoverflow com questi
  • C# 将图像从 PowerPoint 复制到 Word

    我需要一个应用程序将文本和图像从 PowerPoint 复制到 Word 我使用这个库 Microsoft Office Interop PowerPoint 和 Microsoft Office Interop Word 文本很容易传输
  • Android 不同屏幕尺寸的布局

    我正在为 Android 应用程序的布局而苦苦挣扎 我为不同的屏幕尺寸定义了不同的布局 当前的布局目录结构是这样的 layout 布局土地 小布局 布局 xlarge 布局 xlarge 土地 Problem 主要布局目录文件正在显示3 7
  • 联系表格 Laravel 4

    我是 Laravel 4 的菜鸟 联系表单给我带来了一些麻烦 发现了一些东西 全部都使用控制器 但我只需要在路线中使用它 如何创建简单的联系表单 姓名 电子邮件和消息 的路由以将数据发送到管理员电子邮箱 Cheers 这是一种仅使用您的路由
  • 使用 Google 脚本删除电子表格中的空白行

    Spreadsheet 1 Spreadsheet 1 中存在的数据 Name apple android windows linux Germany 3 4 6 7 America 4 1 6 2 Sweden 1 6 1 6 Paris
  • 在C中将字符数字转换为相应的整数

    C语言中有没有办法将字符转换为整数 例如 从 5 to 5 根据其他回复 这很好 char c 5 int x c 0 另外 为了进行错误检查 您可能希望首先检查 isdigit c 是否为 true 请注意 您不能完全便携地对字母执行相同
  • 迭代除 x item 之外的字典

    我有一个这种格式的字典 d data key 1 value 1 key 2 value 2 key 3 value 3 key x value x key n value n 我必须迭代它的项目 for key value in colu
  • 如何区分 Switch,Checkbox 值是由用户更改还是以编程方式(包括通过保留)更改?

    setOnCheckedChangeListener new OnCheckedChangeListener Override public void onCheckedChanged CompoundButton buttonView b
  • 在knockout js中将循环结构转换为JSON

    我有两个网格结构 在其中一个网格结构中我多次有多个字段 而在其中一个网格结构中我一次有两个字段 我为每个网格编写 apply 方法 我的第一个网格 id 工作正常 但是当我单击第二个网格上的 应用 时 我收到此错误 Uncaught Typ
  • 在 C++ 软件中纳入共享软件限制

    我希望在共享软件的基础上实现我的软件 以便用户 给予最多 例如 30 天的试用期来试用该软件 购买时 我打算向用户提供一个随机生成的密钥 输入该密钥时 再次启用该软件 我以前从未走过这条路 所以任何建议 反馈或关于如何完成此操作的 标准 方
  • 避免重新计算 Beam Python SDK 中所有云存储文件的大小

    我正在开发一个从 Google Cloud Storage GCS 目录读取约 500 万个文件的管道 我已将其配置为在 Google Cloud Dataflow 上运行 问题是 当我启动管道时 需要几个小时 计算所有文件的大小 INFO
  • 找不到 pyinstaller 命令

    我在 VirtualBox 上使用 Ubuntu 我该如何添加pyinstaller to the PATH 问题是当我说 pyinstaller file py 它说找不到 pyinstaller 命令 它说它安装正确 根据其他帖子 我认
  • 删除 X-Powered-By

    如何删除 PHP 中的 X Powered By 标头 我在 Apache 服务器上 使用 php 5 21 我无法在 php 中使用 header remove 函数 因为 5 21 不支持它 我使用了 Header unset X Po
  • 检测点是否在 SVG 路径内

    我正在尝试检测给定点是否位于 Objective C 中的闭合 SVG 路径内 我不知道如何做数学 我有一个路径的坐标 我想确定一个随机点是在路径内部还是外部 这是路径坐标的示例 M673 460 c2 0 4 1 5 2 1 1 2 2
  • Objective-C 中的全局变量 - extern 和 .m 文件顶部声明的差异

    我知道你可以使用 extern 在 Objective C 中定义一个全局变量 但我刚刚意识到我在第一个方法之前在 m 文件顶部声明的变量也意外地是全局的 这导致了一些问题 问题 我将它们移至头文件的 interface 部分 我认为这正确